// Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with
// the License. You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on
// an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the
// specific language governing permissions and limitations under the License.

//------------------------------------------------------------------------------
// <auto-generated>
//     This code was generated by google-apis-code-generator 1.5.1
//     C# generator version: 1.22.0
//
//     Changes to this file may cause incorrect behavior and will be lost if
//     the code is regenerated.
// </auto-generated>
//------------------------------------------------------------------------------

/**
 * \brief
 *   Stackdriver Monitoring API Version v3
 *
 * \section ApiInfo API Version Information
 *    <table>
 *      <tr><th>API
 *          <td><a href='https://cloud.google.com/monitoring/api/'>Stackdriver Monitoring API</a>
 *      <tr><th>API Version<td>v3
 *      <tr><th>API Rev<td>20170313 (802)
 *      <tr><th>API Docs
 *          <td><a href='https://cloud.google.com/monitoring/api/'>
 *              https://cloud.google.com/monitoring/api/</a>
 *      <tr><th>Discovery Name<td>monitoring
 *    </table>
 *
 * \section ForMoreInfo For More Information
 *
 * The complete API documentation for using Stackdriver Monitoring API can be found at
 * <a href='https://cloud.google.com/monitoring/api/'>https://cloud.google.com/monitoring/api/</a>.
 *
 * For more information about the Google APIs Client Library for .NET, see
 * <a href='https://developers.google.com/api-client-library/dotnet/get_started'>
 * https://developers.google.com/api-client-library/dotnet/get_started</a>
 */

namespace Google.Apis.Monitoring.v3
{
    /// <summary>The Monitoring Service.</summary>
    public class MonitoringService : Google.Apis.Services.BaseClientService
    {
        /// <summary>The API version.</summary>
        public const string Version = "v3";

        /// <summary>The discovery version used to generate this service.</summary>
        public static Google.Apis.Discovery.DiscoveryVersion DiscoveryVersionUsed =
            Google.Apis.Discovery.DiscoveryVersion.Version_1_0;

        /// <summary>Constructs a new service.</summary>
        public MonitoringService() :
            this(new Google.Apis.Services.BaseClientService.Initializer()) {}

        /// <summary>Constructs a new service.</summary>
        /// <param name="initializer">The service initializer.</param>
        public MonitoringService(Google.Apis.Services.BaseClientService.Initializer initializer)
            : base(initializer)
        {
            projects = new ProjectsResource(this);
        }

        /// <summary>Gets the service supported features.</summary>
        public override System.Collections.Generic.IList<string> Features
        {
            get { return new string[0]; }
        }

        /// <summary>Gets the service name.</summary>
        public override string Name
        {
            get { return "monitoring"; }
        }

        /// <summary>Gets the service base URI.</summary>
        public override string BaseUri
        {
            get { return "https://monitoring.googleapis.com/"; }
        }

        /// <summary>Gets the service base path.</summary>
        public override string BasePath
        {
            get { return ""; }
        }

        /// <summary>Available OAuth 2.0 scopes for use with the Stackdriver Monitoring API.</summary>
        public class Scope
        {
            /// <summary>View and manage your data across Google Cloud Platform services</summary>
            public static string CloudPlatform = "https://www.googleapis.com/auth/cloud-platform";

            /// <summary>View and write monitoring data for all of your Google and third-party Cloud and API
            /// projects</summary>
            public static string Monitoring = "https://www.googleapis.com/auth/monitoring";

            /// <summary>View monitoring data for all of your Google Cloud and third-party projects</summary>
            public static string MonitoringRead = "https://www.googleapis.com/auth/monitoring.read";

            /// <summary>Publish metric data to your Google Cloud projects</summary>
            public static string MonitoringWrite = "https://www.googleapis.com/auth/monitoring.write";

        }



        private readonly ProjectsResource projects;

        /// <summary>Gets the Projects resource.</summary>
        public virtual ProjectsResource Projects
        {
            get { return projects; }
        }
    }

    ///<summary>A base abstract class for Monitoring requests.</summary>
    public abstract class MonitoringBaseServiceRequest<TResponse> : Google.Apis.Requests.ClientServiceRequest<TResponse>
    {
        ///<summary>Constructs a new MonitoringBaseServiceRequest instance.</summary>
        protected MonitoringBaseServiceRequest(Google.Apis.Services.IClientService service)
            : base(service)
        {
        }

        /// <summary>V1 error format.</summary>
        [Google.Apis.Util.RequestParameterAttribute("$.xgafv", Google.Apis.Util.RequestParameterType.Query)]
        public virtual System.Nullable<XgafvEnum> Xgafv { get; set; }

        /// <summary>V1 error format.</summary>
        public enum XgafvEnum
        {
            /// <summary>v1 error format</summary>
            [Google.Apis.Util.StringValueAttribute("1")]
            Value1,
            /// <summary>v2 error format</summary>
            [Google.Apis.Util.StringValueAttribute("2")]
            Value2,
        }

        /// <summary>OAuth access token.</summary>
        [Google.Apis.Util.RequestParameterAttribute("access_token", Google.Apis.Util.RequestParameterType.Query)]
        public virtual string AccessToken { get; set; }

        /// <summary>Data format for response.</summary>
        /// [default: json]
        [Google.Apis.Util.RequestParameterAttribute("alt", Google.Apis.Util.RequestParameterType.Query)]
        public virtual System.Nullable<AltEnum> Alt { get; set; }

        /// <summary>Data format for response.</summary>
        public enum AltEnum
        {
            /// <summary>Responses with Content-Type of application/json</summary>
            [Google.Apis.Util.StringValueAttribute("json")]
            Json,
            /// <summary>Media download with context-dependent Content-Type</summary>
            [Google.Apis.Util.StringValueAttribute("media")]
            Media,
            /// <summary>Responses with Content-Type of application/x-protobuf</summary>
            [Google.Apis.Util.StringValueAttribute("proto")]
            Proto,
        }

        /// <summary>OAuth bearer token.</summary>
        [Google.Apis.Util.RequestParameterAttribute("bearer_token", Google.Apis.Util.RequestParameterType.Query)]
        public virtual string BearerToken { get; set; }

        /// <summary>JSONP</summary>
        [Google.Apis.Util.RequestParameterAttribute("callback", Google.Apis.Util.RequestParameterType.Query)]
        public virtual string Callback { get; set; }

        /// <summary>Selector specifying which fields to include in a partial response.</summary>
        [Google.Apis.Util.RequestParameterAttribute("fields", Google.Apis.Util.RequestParameterType.Query)]
        public virtual string Fields { get; set; }

        /// <summary>API key. Your API key identifies your project and provides you with API access, quota, and reports.
        /// Required unless you provide an OAuth 2.0 token.</summary>
        [Google.Apis.Util.RequestParameterAttribute("key", Google.Apis.Util.RequestParameterType.Query)]
        public virtual string Key { get; set; }

        /// <summary>OAuth 2.0 token for the current user.</summary>
        [Google.Apis.Util.RequestParameterAttribute("oauth_token", Google.Apis.Util.RequestParameterType.Query)]
        public virtual string OauthToken { get; set; }

        /// <summary>Pretty-print response.</summary>
        /// [default: true]
        [Google.Apis.Util.RequestParameterAttribute("pp", Google.Apis.Util.RequestParameterType.Query)]
        public virtual System.Nullable<bool> Pp { get; set; }

        /// <summary>Returns response with indentations and line breaks.</summary>
        /// [default: true]
        [Google.Apis.Util.RequestParameterAttribute("prettyPrint", Google.Apis.Util.RequestParameterType.Query)]
        public virtual System.Nullable<bool> PrettyPrint { get; set; }

        /// <summary>Available to use for quota purposes for server-side applications. Can be any arbitrary string
        /// assigned to a user, but should not exceed 40 characters.</summary>
        [Google.Apis.Util.RequestParameterAttribute("quotaUser", Google.Apis.Util.RequestParameterType.Query)]
        public virtual string QuotaUser { get; set; }

        /// <summary>Legacy upload protocol for media (e.g. "media", "multipart").</summary>
        [Google.Apis.Util.RequestParameterAttribute("uploadType", Google.Apis.Util.RequestParameterType.Query)]
        public virtual string UploadType { get; set; }

        /// <summary>Upload protocol for media (e.g. "raw", "multipart").</summary>
        [Google.Apis.Util.RequestParameterAttribute("upload_protocol", Google.Apis.Util.RequestParameterType.Query)]
        public virtual string UploadProtocol { get; set; }

        /// <summary>Initializes Monitoring parameter list.</summary>
        protected override void InitParameters()
        {
            base.InitParameters();

            RequestParameters.Add(
                "$.xgafv", new Google.Apis.Discovery.Parameter
                {
                    Name = "$.xgafv",
                    IsRequired = false,
                    ParameterType = "query",
                    DefaultValue = null,
                    Pattern = null,
                });
            RequestParameters.Add(
                "access_token", new Google.Apis.Discovery.Parameter
                {
                    Name = "access_token",
                    IsRequired = false,
                    ParameterType = "query",
                    DefaultValue = null,
                    Pattern = null,
                });
            RequestParameters.Add(
                "alt", new Google.Apis.Discovery.Parameter
                {
                    Name = "alt",
                    IsRequired = false,
                    ParameterType = "query",
                    DefaultValue = "json",
                    Pattern = null,
                });
            RequestParameters.Add(
                "bearer_token", new Google.Apis.Discovery.Parameter
                {
                    Name = "bearer_token",
                    IsRequired = false,
                    ParameterType = "query",
                    DefaultValue = null,
                    Pattern = null,
                });
            RequestParameters.Add(
                "callback", new Google.Apis.Discovery.Parameter
                {
                    Name = "callback",
                    IsRequired = false,
                    ParameterType = "query",
                    DefaultValue = null,
                    Pattern = null,
                });
            RequestParameters.Add(
                "fields", new Google.Apis.Discovery.Parameter
                {
                    Name = "fields",
                    IsRequired = false,
                    ParameterType = "query",
                    DefaultValue = null,
                    Pattern = null,
                });
            RequestParameters.Add(
                "key", new Google.Apis.Discovery.Parameter
                {
                    Name = "key",
                    IsRequired = false,
                    ParameterType = "query",
                    DefaultValue = null,
                    Pattern = null,
                });
            RequestParameters.Add(
                "oauth_token", new Google.Apis.Discovery.Parameter
                {
                    Name = "oauth_token",
                    IsRequired = false,
                    ParameterType = "query",
                    DefaultValue = null,
                    Pattern = null,
                });
            RequestParameters.Add(
                "pp", new Google.Apis.Discovery.Parameter
                {
                    Name = "pp",
                    IsRequired = false,
                    ParameterType = "query",
                    DefaultValue = "true",
                    Pattern = null,
                });
            RequestParameters.Add(
                "prettyPrint", new Google.Apis.Discovery.Parameter
                {
                    Name = "prettyPrint",
                    IsRequired = false,
                    ParameterType = "query",
                    DefaultValue = "true",
                    Pattern = null,
                });
            RequestParameters.Add(
                "quotaUser", new Google.Apis.Discovery.Parameter
                {
                    Name = "quotaUser",
                    IsRequired = false,
                    ParameterType = "query",
                    DefaultValue = null,
                    Pattern = null,
                });
            RequestParameters.Add(
                "uploadType", new Google.Apis.Discovery.Parameter
                {
                    Name = "uploadType",
                    IsRequired = false,
                    ParameterType = "query",
                    DefaultValue = null,
                    Pattern = null,
                });
            RequestParameters.Add(
                "upload_protocol", new Google.Apis.Discovery.Parameter
                {
                    Name = "upload_protocol",
                    IsRequired = false,
                    ParameterType = "query",
                    DefaultValue = null,
                    Pattern = null,
                });
        }
    }

    /// <summary>The "projects" collection of methods.</summary>
    public class ProjectsResource
    {
        private const string Resource = "projects";

        /// <summary>The service which this resource belongs to.</summary>
        private readonly Google.Apis.Services.IClientService service;

        /// <summary>Constructs a new resource.</summary>
        public ProjectsResource(Google.Apis.Services.IClientService service)
        {
            this.service = service;
            collectdTimeSeries = new CollectdTimeSeriesResource(service);
            groups = new GroupsResource(service);
            metricDescriptors = new MetricDescriptorsResource(service);
            monitoredResourceDescriptors = new MonitoredResourceDescriptorsResource(service);
            timeSeries = new TimeSeriesResource(service);

        }

        private readonly CollectdTimeSeriesResource collectdTimeSeries;

        /// <summary>Gets the CollectdTimeSeries resource.</summary>
        public virtual CollectdTimeSeriesResource CollectdTimeSeries
        {
            get { return collectdTimeSeries; }
        }

        /// <summary>The "collectdTimeSeries" collection of methods.</summary>
        public class CollectdTimeSeriesResource
        {
            private const string Resource = "collectdTimeSeries";

            /// <summary>The service which this resource belongs to.</summary>
            private readonly Google.Apis.Services.IClientService service;

            /// <summary>Constructs a new resource.</summary>
            public CollectdTimeSeriesResource(Google.Apis.Services.IClientService service)
            {
                this.service = service;

            }


            /// <summary>Stackdriver Monitoring Agent only: Creates a new time series.This method is only for use by the
            /// Stackdriver Monitoring Agent. Use projects.timeSeries.create instead.</summary>
            /// <param name="body">The body of the request.</param>
            /// <param name="name">The project in which to create the time series. The format is
            /// "projects/PROJECT_ID_OR_NUMBER".</param>
            public virtual CreateRequest Create(Google.Apis.Monitoring.v3.Data.CreateCollectdTimeSeriesRequest body, string name)
            {
                return new CreateRequest(service, body, name);
            }

            /// <summary>Stackdriver Monitoring Agent only: Creates a new time series.This method is only for use by the
            /// Stackdriver Monitoring Agent. Use projects.timeSeries.create instead.</summary>
            public class CreateRequest : MonitoringBaseServiceRequest<Google.Apis.Monitoring.v3.Data.Empty>
            {
                /// <summary>Constructs a new Create request.</summary>
                public CreateRequest(Google.Apis.Services.IClientService service, Google.Apis.Monitoring.v3.Data.CreateCollectdTimeSeriesRequest body, string name)
                    : base(service)
                {
                    Name = name;
                    Body = body;
                    InitParameters();
                }


                /// <summary>The project in which to create the time series. The format is
                /// "projects/PROJECT_ID_OR_NUMBER".</summary>
                [Google.Apis.Util.RequestParameterAttribute("name", Google.Apis.Util.RequestParameterType.Path)]
                public virtual string Name { get; private set; }


                /// <summary>Gets or sets the body of this request.</summary>
                Google.Apis.Monitoring.v3.Data.CreateCollectdTimeSeriesRequest Body { get; set; }

                ///<summary>Returns the body of the request.</summary>
                protected override object GetBody() { return Body; }

                ///<summary>Gets the method name.</summary>
                public override string MethodName
                {
                    get { return "create"; }
                }

                ///<summary>Gets the HTTP method.</summary>
                public override string HttpMethod
                {
                    get { return "POST"; }
                }

                ///<summary>Gets the REST path.</summary>
                public override string RestPath
                {
                    get { return "v3/{+name}/collectdTimeSeries"; }
                }

                /// <summary>Initializes Create parameter list.</summary>
                protected override void InitParameters()
                {
                    base.InitParameters();

                    RequestParameters.Add(
                        "name", new Google.Apis.Discovery.Parameter
                        {
                            Name = "name",
                            IsRequired = true,
                            ParameterType = "path",
                            DefaultValue = null,
                            Pattern = @"^projects/[^/]+$",
                        });
                }

            }
        }
        private readonly GroupsResource groups;

        /// <summary>Gets the Groups resource.</summary>
        public virtual GroupsResource Groups
        {
            get { return groups; }
        }

        /// <summary>The "groups" collection of methods.</summary>
        public class GroupsResource
        {
            private const string Resource = "groups";

            /// <summary>The service which this resource belongs to.</summary>
            private readonly Google.Apis.Services.IClientService service;

            /// <summary>Constructs a new resource.</summary>
            public GroupsResource(Google.Apis.Services.IClientService service)
            {
                this.service = service;
                members = new MembersResource(service);

            }

            private readonly MembersResource members;

            /// <summary>Gets the Members resource.</summary>
            public virtual MembersResource Members
            {
                get { return members; }
            }

            /// <summary>The "members" collection of methods.</summary>
            public class MembersResource
            {
                private const string Resource = "members";

                /// <summary>The service which this resource belongs to.</summary>
                private readonly Google.Apis.Services.IClientService service;

                /// <summary>Constructs a new resource.</summary>
                public MembersResource(Google.Apis.Services.IClientService service)
                {
                    this.service = service;

                }


                /// <summary>Lists the monitored resources that are members of a group.</summary>
                /// <param name="name">The group whose members are listed. The format is
                /// "projects/{project_id_or_number}/groups/{group_id}".</param>
                public virtual ListRequest List(string name)
                {
                    return new ListRequest(service, name);
                }

                /// <summary>Lists the monitored resources that are members of a group.</summary>
                public class ListRequest : MonitoringBaseServiceRequest<Google.Apis.Monitoring.v3.Data.ListGroupMembersResponse>
                {
                    /// <summary>Constructs a new List request.</summary>
                    public ListRequest(Google.Apis.Services.IClientService service, string name)
                        : base(service)
                    {
                        Name = name;
                        InitParameters();
                    }


                    /// <summary>The group whose members are listed. The format is
                    /// "projects/{project_id_or_number}/groups/{group_id}".</summary>
                    [Google.Apis.Util.RequestParameterAttribute("name", Google.Apis.Util.RequestParameterType.Path)]
                    public virtual string Name { get; private set; }

                    /// <summary>A positive number that is the maximum number of results to return.</summary>
                    [Google.Apis.Util.RequestParameterAttribute("pageSize", Google.Apis.Util.RequestParameterType.Query)]
                    public virtual System.Nullable<int> PageSize { get; set; }

                    /// <summary>Optional. The beginning of the time interval. The default value for the start time is
                    /// the end time. The start time must not be later than the end time.</summary>
                    [Google.Apis.Util.RequestParameterAttribute("interval.startTime", Google.Apis.Util.RequestParameterType.Query)]
                    public virtual object IntervalStartTime { get; set; }

                    /// <summary>Required. The end of the time interval.</summary>
                    [Google.Apis.Util.RequestParameterAttribute("interval.endTime", Google.Apis.Util.RequestParameterType.Query)]
                    public virtual object IntervalEndTime { get; set; }

                    /// <summary>An optional list filter describing the members to be returned. The filter may reference
                    /// the type, labels, and metadata of monitored resources that comprise the group. For example, to
                    /// return only resources representing Compute Engine VM instances, use this filter: resource.type =
                    /// "gce_instance" </summary>
                    [Google.Apis.Util.RequestParameterAttribute("filter", Google.Apis.Util.RequestParameterType.Query)]
                    public virtual string Filter { get; set; }

                    /// <summary>If this field is not empty then it must contain the nextPageToken value returned by a
                    /// previous call to this method. Using this field causes the method to return additional results
                    /// from the previous method call.</summary>
                    [Google.Apis.Util.RequestParameterAttribute("pageToken", Google.Apis.Util.RequestParameterType.Query)]
                    public virtual string PageToken { get; set; }


                    ///<summary>Gets the method name.</summary>
                    public override string MethodName
                    {
                        get { return "list"; }
                    }

                    ///<summary>Gets the HTTP method.</summary>
                    public override string HttpMethod
                    {
                        get { return "GET"; }
                    }

                    ///<summary>Gets the REST path.</summary>
                    public override string RestPath
                    {
                        get { return "v3/{+name}/members"; }
                    }

                    /// <summary>Initializes List parameter list.</summary>
                    protected override void InitParameters()
                    {
                        base.InitParameters();

                        RequestParameters.Add(
                            "name", new Google.Apis.Discovery.Parameter
                            {
                                Name = "name",
                                IsRequired = true,
                                ParameterType = "path",
                                DefaultValue = null,
                                Pattern = @"^projects/[^/]+/groups/[^/]+$",
                            });
                        RequestParameters.Add(
                            "pageSize", new Google.Apis.Discovery.Parameter
                            {
                                Name = "pageSize",
                                IsRequired = false,
                                ParameterType = "query",
                                DefaultValue = null,
                                Pattern = null,
                            });
                        RequestParameters.Add(
                            "interval.startTime", new Google.Apis.Discovery.Parameter
                            {
                                Name = "interval.startTime",
                                IsRequired = false,
                                ParameterType = "query",
                                DefaultValue = null,
                                Pattern = null,
                            });
                        RequestParameters.Add(
                            "interval.endTime", new Google.Apis.Discovery.Parameter
                            {
                                Name = "interval.endTime",
                                IsRequired = false,
                                ParameterType = "query",
                                DefaultValue = null,
                                Pattern = null,
                            });
                        RequestParameters.Add(
                            "filter", new Google.Apis.Discovery.Parameter
                            {
                                Name = "filter",
                                IsRequired = false,
                                ParameterType = "query",
                                DefaultValue = null,
                                Pattern = null,
                            });
                        RequestParameters.Add(
                            "pageToken", new Google.Apis.Discovery.Parameter
                            {
                                Name = "pageToken",
                                IsRequired = false,
                                ParameterType = "query",
                                DefaultValue = null,
                                Pattern = null,
                            });
                    }

                }
            }

            /// <summary>Creates a new group.</summary>
            /// <param name="body">The body of the request.</param>
            /// <param name="name">The project in which to create the group. The format is
            /// "projects/{project_id_or_number}".</param>
            public virtual CreateRequest Create(Google.Apis.Monitoring.v3.Data.Group body, string name)
            {
                return new CreateRequest(service, body, name);
            }

            /// <summary>Creates a new group.</summary>
            public class CreateRequest : MonitoringBaseServiceRequest<Google.Apis.Monitoring.v3.Data.Group>
            {
                /// <summary>Constructs a new Create request.</summary>
                public CreateRequest(Google.Apis.Services.IClientService service, Google.Apis.Monitoring.v3.Data.Group body, string name)
                    : base(service)
                {
                    Name = name;
                    Body = body;
                    InitParameters();
                }


                /// <summary>The project in which to create the group. The format is
                /// "projects/{project_id_or_number}".</summary>
                [Google.Apis.Util.RequestParameterAttribute("name", Google.Apis.Util.RequestParameterType.Path)]
                public virtual string Name { get; private set; }

                /// <summary>If true, validate this request but do not create the group.</summary>
                [Google.Apis.Util.RequestParameterAttribute("validateOnly", Google.Apis.Util.RequestParameterType.Query)]
                public virtual System.Nullable<bool> ValidateOnly { get; set; }


                /// <summary>Gets or sets the body of this request.</summary>
                Google.Apis.Monitoring.v3.Data.Group Body { get; set; }

                ///<summary>Returns the body of the request.</summary>
                protected override object GetBody() { return Body; }

                ///<summary>Gets the method name.</summary>
                public override string MethodName
                {
                    get { return "create"; }
                }

                ///<summary>Gets the HTTP method.</summary>
                public override string HttpMethod
                {
                    get { return "POST"; }
                }

                ///<summary>Gets the REST path.</summary>
                public override string RestPath
                {
                    get { return "v3/{+name}/groups"; }
                }

                /// <summary>Initializes Create parameter list.</summary>
                protected override void InitParameters()
                {
                    base.InitParameters();

                    RequestParameters.Add(
                        "name", new Google.Apis.Discovery.Parameter
                        {
                            Name = "name",
                            IsRequired = true,
                            ParameterType = "path",
                            DefaultValue = null,
                            Pattern = @"^projects/[^/]+$",
                        });
                    RequestParameters.Add(
                        "validateOnly", new Google.Apis.Discovery.Parameter
                        {
                            Name = "validateOnly",
                            IsRequired = false,
                            ParameterType = "query",
                            DefaultValue = null,
                            Pattern = null,
                        });
                }

            }

            /// <summary>Deletes an existing group.</summary>
            /// <param name="name">The group to delete. The format is
            /// "projects/{project_id_or_number}/groups/{group_id}".</param>
            public virtual DeleteRequest Delete(string name)
            {
                return new DeleteRequest(service, name);
            }

            /// <summary>Deletes an existing group.</summary>
            public class DeleteRequest : MonitoringBaseServiceRequest<Google.Apis.Monitoring.v3.Data.Empty>
            {
                /// <summary>Constructs a new Delete request.</summary>
                public DeleteRequest(Google.Apis.Services.IClientService service, string name)
                    : base(service)
                {
                    Name = name;
                    InitParameters();
                }


                /// <summary>The group to delete. The format is
                /// "projects/{project_id_or_number}/groups/{group_id}".</summary>
                [Google.Apis.Util.RequestParameterAttribute("name", Google.Apis.Util.RequestParameterType.Path)]
                public virtual string Name { get; private set; }


                ///<summary>Gets the method name.</summary>
                public override string MethodName
                {
                    get { return "delete"; }
                }

                ///<summary>Gets the HTTP method.</summary>
                public override string HttpMethod
                {
                    get { return "DELETE"; }
                }

                ///<summary>Gets the REST path.</summary>
                public override string RestPath
                {
                    get { return "v3/{+name}"; }
                }

                /// <summary>Initializes Delete parameter list.</summary>
                protected override void InitParameters()
                {
                    base.InitParameters();

                    RequestParameters.Add(
                        "name", new Google.Apis.Discovery.Parameter
                        {
                            Name = "name",
                            IsRequired = true,
                            ParameterType = "path",
                            DefaultValue = null,
                            Pattern = @"^projects/[^/]+/groups/[^/]+$",
                        });
                }

            }

            /// <summary>Gets a single group.</summary>
            /// <param name="name">The group to retrieve. The format is
            /// "projects/{project_id_or_number}/groups/{group_id}".</param>
            public virtual GetRequest Get(string name)
            {
                return new GetRequest(service, name);
            }

            /// <summary>Gets a single group.</summary>
            public class GetRequest : MonitoringBaseServiceRequest<Google.Apis.Monitoring.v3.Data.Group>
            {
                /// <summary>Constructs a new Get request.</summary>
                public GetRequest(Google.Apis.Services.IClientService service, string name)
                    : base(service)
                {
                    Name = name;
                    InitParameters();
                }


                /// <summary>The group to retrieve. The format is
                /// "projects/{project_id_or_number}/groups/{group_id}".</summary>
                [Google.Apis.Util.RequestParameterAttribute("name", Google.Apis.Util.RequestParameterType.Path)]
                public virtual string Name { get; private set; }


                ///<summary>Gets the method name.</summary>
                public override string MethodName
                {
                    get { return "get"; }
                }

                ///<summary>Gets the HTTP method.</summary>
                public override string HttpMethod
                {
                    get { return "GET"; }
                }

                ///<summary>Gets the REST path.</summary>
                public override string RestPath
                {
                    get { return "v3/{+name}"; }
                }

                /// <summary>Initializes Get parameter list.</summary>
                protected override void InitParameters()
                {
                    base.InitParameters();

                    RequestParameters.Add(
                        "name", new Google.Apis.Discovery.Parameter
                        {
                            Name = "name",
                            IsRequired = true,
                            ParameterType = "path",
                            DefaultValue = null,
                            Pattern = @"^projects/[^/]+/groups/[^/]+$",
                        });
                }

            }

            /// <summary>Lists the existing groups.</summary>
            /// <param name="name">The project whose groups are to be listed. The format is
            /// "projects/{project_id_or_number}".</param>
            public virtual ListRequest List(string name)
            {
                return new ListRequest(service, name);
            }

            /// <summary>Lists the existing groups.</summary>
            public class ListRequest : MonitoringBaseServiceRequest<Google.Apis.Monitoring.v3.Data.ListGroupsResponse>
            {
                /// <summary>Constructs a new List request.</summary>
                public ListRequest(Google.Apis.Services.IClientService service, string name)
                    : base(service)
                {
                    Name = name;
                    InitParameters();
                }


                /// <summary>The project whose groups are to be listed. The format is
                /// "projects/{project_id_or_number}".</summary>
                [Google.Apis.Util.RequestParameterAttribute("name", Google.Apis.Util.RequestParameterType.Path)]
                public virtual string Name { get; private set; }

                /// <summary>A positive number that is the maximum number of results to return.</summary>
                [Google.Apis.Util.RequestParameterAttribute("pageSize", Google.Apis.Util.RequestParameterType.Query)]
                public virtual System.Nullable<int> PageSize { get; set; }

                /// <summary>A group name: "projects/{project_id_or_number}/groups/{group_id}". Returns groups that are
                /// ancestors of the specified group. The groups are returned in order, starting with the immediate
                /// parent and ending with the most distant ancestor. If the specified group has no immediate parent,
                /// the results are empty.</summary>
                [Google.Apis.Util.RequestParameterAttribute("ancestorsOfGroup", Google.Apis.Util.RequestParameterType.Query)]
                public virtual string AncestorsOfGroup { get; set; }

                /// <summary>A group name: "projects/{project_id_or_number}/groups/{group_id}". Returns groups whose
                /// parentName field contains the group name. If no groups have this parent, the results are
                /// empty.</summary>
                [Google.Apis.Util.RequestParameterAttribute("childrenOfGroup", Google.Apis.Util.RequestParameterType.Query)]
                public virtual string ChildrenOfGroup { get; set; }

                /// <summary>A group name: "projects/{project_id_or_number}/groups/{group_id}". Returns the descendants
                /// of the specified group. This is a superset of the results returned by the childrenOfGroup filter,
                /// and includes children-of-children, and so forth.</summary>
                [Google.Apis.Util.RequestParameterAttribute("descendantsOfGroup", Google.Apis.Util.RequestParameterType.Query)]
                public virtual string DescendantsOfGroup { get; set; }

                /// <summary>If this field is not empty then it must contain the nextPageToken value returned by a
                /// previous call to this method. Using this field causes the method to return additional results from
                /// the previous method call.</summary>
                [Google.Apis.Util.RequestParameterAttribute("pageToken", Google.Apis.Util.RequestParameterType.Query)]
                public virtual string PageToken { get; set; }


                ///<summary>Gets the method name.</summary>
                public override string MethodName
                {
                    get { return "list"; }
                }

                ///<summary>Gets the HTTP method.</summary>
                public override string HttpMethod
                {
                    get { return "GET"; }
                }

                ///<summary>Gets the REST path.</summary>
                public override string RestPath
                {
                    get { return "v3/{+name}/groups"; }
                }

                /// <summary>Initializes List parameter list.</summary>
                protected override void InitParameters()
                {
                    base.InitParameters();

                    RequestParameters.Add(
                        "name", new Google.Apis.Discovery.Parameter
                        {
                            Name = "name",
                            IsRequired = true,
                            ParameterType = "path",
                            DefaultValue = null,
                            Pattern = @"^projects/[^/]+$",
                        });
                    RequestParameters.Add(
                        "pageSize", new Google.Apis.Discovery.Parameter
                        {
                            Name = "pageSize",
                            IsRequired = false,
                            ParameterType = "query",
                            DefaultValue = null,
                            Pattern = null,
                        });
                    RequestParameters.Add(
                        "ancestorsOfGroup", new Google.Apis.Discovery.Parameter
                        {
                            Name = "ancestorsOfGroup",
                            IsRequired = false,
                            ParameterType = "query",
                            DefaultValue = null,
                            Pattern = null,
                        });
                    RequestParameters.Add(
                        "childrenOfGroup", new Google.Apis.Discovery.Parameter
                        {
                            Name = "childrenOfGroup",
                            IsRequired = false,
                            ParameterType = "query",
                            DefaultValue = null,
                            Pattern = null,
                        });
                    RequestParameters.Add(
                        "descendantsOfGroup", new Google.Apis.Discovery.Parameter
                        {
                            Name = "descendantsOfGroup",
                            IsRequired = false,
                            ParameterType = "query",
                            DefaultValue = null,
                            Pattern = null,
                        });
                    RequestParameters.Add(
                        "pageToken", new Google.Apis.Discovery.Parameter
                        {
                            Name = "pageToken",
                            IsRequired = false,
                            ParameterType = "query",
                            DefaultValue = null,
                            Pattern = null,
                        });
                }

            }

            /// <summary>Updates an existing group. You can change any group attributes except name.</summary>
            /// <param name="body">The body of the request.</param>
            /// <param name="name">Output only. The name of this group. The format is
            /// "projects/{project_id_or_number}/groups/{group_id}". When creating a group, this field is ignored and a new name is
            /// created consisting of the project specified in the call to CreateGroup and a unique {group_id} that is generated
            /// automatically.</param>
            public virtual UpdateRequest Update(Google.Apis.Monitoring.v3.Data.Group body, string name)
            {
                return new UpdateRequest(service, body, name);
            }

            /// <summary>Updates an existing group. You can change any group attributes except name.</summary>
            public class UpdateRequest : MonitoringBaseServiceRequest<Google.Apis.Monitoring.v3.Data.Group>
            {
                /// <summary>Constructs a new Update request.</summary>
                public UpdateRequest(Google.Apis.Services.IClientService service, Google.Apis.Monitoring.v3.Data.Group body, string name)
                    : base(service)
                {
                    Name = name;
                    Body = body;
                    InitParameters();
                }


                /// <summary>Output only. The name of this group. The format is
                /// "projects/{project_id_or_number}/groups/{group_id}". When creating a group, this field is ignored
                /// and a new name is created consisting of the project specified in the call to CreateGroup and a
                /// unique {group_id} that is generated automatically.</summary>
                [Google.Apis.Util.RequestParameterAttribute("name", Google.Apis.Util.RequestParameterType.Path)]
                public virtual string Name { get; private set; }

                /// <summary>If true, validate this request but do not update the existing group.</summary>
                [Google.Apis.Util.RequestParameterAttribute("validateOnly", Google.Apis.Util.RequestParameterType.Query)]
                public virtual System.Nullable<bool> ValidateOnly { get; set; }


                /// <summary>Gets or sets the body of this request.</summary>
                Google.Apis.Monitoring.v3.Data.Group Body { get; set; }

                ///<summary>Returns the body of the request.</summary>
                protected override object GetBody() { return Body; }

                ///<summary>Gets the method name.</summary>
                public override string MethodName
                {
                    get { return "update"; }
                }

                ///<summary>Gets the HTTP method.</summary>
                public override string HttpMethod
                {
                    get { return "PUT"; }
                }

                ///<summary>Gets the REST path.</summary>
                public override string RestPath
                {
                    get { return "v3/{+name}"; }
                }

                /// <summary>Initializes Update parameter list.</summary>
                protected override void InitParameters()
                {
                    base.InitParameters();

                    RequestParameters.Add(
                        "name", new Google.Apis.Discovery.Parameter
                        {
                            Name = "name",
                            IsRequired = true,
                            ParameterType = "path",
                            DefaultValue = null,
                            Pattern = @"^projects/[^/]+/groups/[^/]+$",
                        });
                    RequestParameters.Add(
                        "validateOnly", new Google.Apis.Discovery.Parameter
                        {
                            Name = "validateOnly",
                            IsRequired = false,
                            ParameterType = "query",
                            DefaultValue = null,
                            Pattern = null,
                        });
                }

            }
        }
        private readonly MetricDescriptorsResource metricDescriptors;

        /// <summary>Gets the MetricDescriptors resource.</summary>
        public virtual MetricDescriptorsResource MetricDescriptors
        {
            get { return metricDescriptors; }
        }

        /// <summary>The "metricDescriptors" collection of methods.</summary>
        public class MetricDescriptorsResource
        {
            private const string Resource = "metricDescriptors";

            /// <summary>The service which this resource belongs to.</summary>
            private readonly Google.Apis.Services.IClientService service;

            /// <summary>Constructs a new resource.</summary>
            public MetricDescriptorsResource(Google.Apis.Services.IClientService service)
            {
                this.service = service;

            }


            /// <summary>Creates a new metric descriptor. User-created metric descriptors define custom
            /// metrics.</summary>
            /// <param name="body">The body of the request.</param>
            /// <param name="name">The project on which to execute the request. The format is
            /// "projects/{project_id_or_number}".</param>
            public virtual CreateRequest Create(Google.Apis.Monitoring.v3.Data.MetricDescriptor body, string name)
            {
                return new CreateRequest(service, body, name);
            }

            /// <summary>Creates a new metric descriptor. User-created metric descriptors define custom
            /// metrics.</summary>
            public class CreateRequest : MonitoringBaseServiceRequest<Google.Apis.Monitoring.v3.Data.MetricDescriptor>
            {
                /// <summary>Constructs a new Create request.</summary>
                public CreateRequest(Google.Apis.Services.IClientService service, Google.Apis.Monitoring.v3.Data.MetricDescriptor body, string name)
                    : base(service)
                {
                    Name = name;
                    Body = body;
                    InitParameters();
                }


                /// <summary>The project on which to execute the request. The format is
                /// "projects/{project_id_or_number}".</summary>
                [Google.Apis.Util.RequestParameterAttribute("name", Google.Apis.Util.RequestParameterType.Path)]
                public virtual string Name { get; private set; }


                /// <summary>Gets or sets the body of this request.</summary>
                Google.Apis.Monitoring.v3.Data.MetricDescriptor Body { get; set; }

                ///<summary>Returns the body of the request.</summary>
                protected override object GetBody() { return Body; }

                ///<summary>Gets the method name.</summary>
                public override string MethodName
                {
                    get { return "create"; }
                }

                ///<summary>Gets the HTTP method.</summary>
                public override string HttpMethod
                {
                    get { return "POST"; }
                }

                ///<summary>Gets the REST path.</summary>
                public override string RestPath
                {
                    get { return "v3/{+name}/metricDescriptors"; }
                }

                /// <summary>Initializes Create parameter list.</summary>
                protected override void InitParameters()
                {
                    base.InitParameters();

                    RequestParameters.Add(
                        "name", new Google.Apis.Discovery.Parameter
                        {
                            Name = "name",
                            IsRequired = true,
                            ParameterType = "path",
                            DefaultValue = null,
                            Pattern = @"^projects/[^/]+$",
                        });
                }

            }

            /// <summary>Deletes a metric descriptor. Only user-created custom metrics can be deleted.</summary>
            /// <param name="name">The metric descriptor on which to execute the request. The format is
            /// "projects/{project_id_or_number}/metricDescriptors/{metric_id}". An example of {metric_id} is:
            /// "custom.googleapis.com/my_test_metric".</param>
            public virtual DeleteRequest Delete(string name)
            {
                return new DeleteRequest(service, name);
            }

            /// <summary>Deletes a metric descriptor. Only user-created custom metrics can be deleted.</summary>
            public class DeleteRequest : MonitoringBaseServiceRequest<Google.Apis.Monitoring.v3.Data.Empty>
            {
                /// <summary>Constructs a new Delete request.</summary>
                public DeleteRequest(Google.Apis.Services.IClientService service, string name)
                    : base(service)
                {
                    Name = name;
                    InitParameters();
                }


                /// <summary>The metric descriptor on which to execute the request. The format is
                /// "projects/{project_id_or_number}/metricDescriptors/{metric_id}". An example of {metric_id} is:
                /// "custom.googleapis.com/my_test_metric".</summary>
                [Google.Apis.Util.RequestParameterAttribute("name", Google.Apis.Util.RequestParameterType.Path)]
                public virtual string Name { get; private set; }


                ///<summary>Gets the method name.</summary>
                public override string MethodName
                {
                    get { return "delete"; }
                }

                ///<summary>Gets the HTTP method.</summary>
                public override string HttpMethod
                {
                    get { return "DELETE"; }
                }

                ///<summary>Gets the REST path.</summary>
                public override string RestPath
                {
                    get { return "v3/{+name}"; }
                }

                /// <summary>Initializes Delete parameter list.</summary>
                protected override void InitParameters()
                {
                    base.InitParameters();

                    RequestParameters.Add(
                        "name", new Google.Apis.Discovery.Parameter
                        {
                            Name = "name",
                            IsRequired = true,
                            ParameterType = "path",
                            DefaultValue = null,
                            Pattern = @"^projects/[^/]+/metricDescriptors/.+$",
                        });
                }

            }

            /// <summary>Gets a single metric descriptor. This method does not require a Stackdriver account.</summary>
            /// <param name="name">The metric descriptor on which to execute the request. The format is
            /// "projects/{project_id_or_number}/metricDescriptors/{metric_id}". An example value of {metric_id} is
            /// "compute.googleapis.com/instance/disk/read_bytes_count".</param>
            public virtual GetRequest Get(string name)
            {
                return new GetRequest(service, name);
            }

            /// <summary>Gets a single metric descriptor. This method does not require a Stackdriver account.</summary>
            public class GetRequest : MonitoringBaseServiceRequest<Google.Apis.Monitoring.v3.Data.MetricDescriptor>
            {
                /// <summary>Constructs a new Get request.</summary>
                public GetRequest(Google.Apis.Services.IClientService service, string name)
                    : base(service)
                {
                    Name = name;
                    InitParameters();
                }


                /// <summary>The metric descriptor on which to execute the request. The format is
                /// "projects/{project_id_or_number}/metricDescriptors/{metric_id}". An example value of {metric_id} is
                /// "compute.googleapis.com/instance/disk/read_bytes_count".</summary>
                [Google.Apis.Util.RequestParameterAttribute("name", Google.Apis.Util.RequestParameterType.Path)]
                public virtual string Name { get; private set; }


                ///<summary>Gets the method name.</summary>
                public override string MethodName
                {
                    get { return "get"; }
                }

                ///<summary>Gets the HTTP method.</summary>
                public override string HttpMethod
                {
                    get { return "GET"; }
                }

                ///<summary>Gets the REST path.</summary>
                public override string RestPath
                {
                    get { return "v3/{+name}"; }
                }

                /// <summary>Initializes Get parameter list.</summary>
                protected override void InitParameters()
                {
                    base.InitParameters();

                    RequestParameters.Add(
                        "name", new Google.Apis.Discovery.Parameter
                        {
                            Name = "name",
                            IsRequired = true,
                            ParameterType = "path",
                            DefaultValue = null,
                            Pattern = @"^projects/[^/]+/metricDescriptors/.+$",
                        });
                }

            }

            /// <summary>Lists metric descriptors that match a filter. This method does not require a Stackdriver
            /// account.</summary>
            /// <param name="name">The project on which to execute the request. The format is
            /// "projects/{project_id_or_number}".</param>
            public virtual ListRequest List(string name)
            {
                return new ListRequest(service, name);
            }

            /// <summary>Lists metric descriptors that match a filter. This method does not require a Stackdriver
            /// account.</summary>
            public class ListRequest : MonitoringBaseServiceRequest<Google.Apis.Monitoring.v3.Data.ListMetricDescriptorsResponse>
            {
                /// <summary>Constructs a new List request.</summary>
                public ListRequest(Google.Apis.Services.IClientService service, string name)
                    : base(service)
                {
                    Name = name;
                    InitParameters();
                }


                /// <summary>The project on which to execute the request. The format is
                /// "projects/{project_id_or_number}".</summary>
                [Google.Apis.Util.RequestParameterAttribute("name", Google.Apis.Util.RequestParameterType.Path)]
                public virtual string Name { get; private set; }

                /// <summary>If this field is empty, all custom and system-defined metric descriptors are returned.
                /// Otherwise, the filter specifies which metric descriptors are to be returned. For example, the
                /// following filter matches all custom metrics: metric.type = starts_with("custom.googleapis.com/")
                /// </summary>
                [Google.Apis.Util.RequestParameterAttribute("filter", Google.Apis.Util.RequestParameterType.Query)]
                public virtual string Filter { get; set; }

                /// <summary>If this field is not empty then it must contain the nextPageToken value returned by a
                /// previous call to this method. Using this field causes the method to return additional results from
                /// the previous method call.</summary>
                [Google.Apis.Util.RequestParameterAttribute("pageToken", Google.Apis.Util.RequestParameterType.Query)]
                public virtual string PageToken { get; set; }

                /// <summary>A positive number that is the maximum number of results to return.</summary>
                [Google.Apis.Util.RequestParameterAttribute("pageSize", Google.Apis.Util.RequestParameterType.Query)]
                public virtual System.Nullable<int> PageSize { get; set; }


                ///<summary>Gets the method name.</summary>
                public override string MethodName
                {
                    get { return "list"; }
                }

                ///<summary>Gets the HTTP method.</summary>
                public override string HttpMethod
                {
                    get { return "GET"; }
                }

                ///<summary>Gets the REST path.</summary>
                public override string RestPath
                {
                    get { return "v3/{+name}/metricDescriptors"; }
                }

                /// <summary>Initializes List parameter list.</summary>
                protected override void InitParameters()
                {
                    base.InitParameters();

                    RequestParameters.Add(
                        "name", new Google.Apis.Discovery.Parameter
                        {
                            Name = "name",
                            IsRequired = true,
                            ParameterType = "path",
                            DefaultValue = null,
                            Pattern = @"^projects/[^/]+$",
                        });
                    RequestParameters.Add(
                        "filter", new Google.Apis.Discovery.Parameter
                        {
                            Name = "filter",
                            IsRequired = false,
                            ParameterType = "query",
                            DefaultValue = null,
                            Pattern = null,
                        });
                    RequestParameters.Add(
                        "pageToken", new Google.Apis.Discovery.Parameter
                        {
                            Name = "pageToken",
                            IsRequired = false,
                            ParameterType = "query",
                            DefaultValue = null,
                            Pattern = null,
                        });
                    RequestParameters.Add(
                        "pageSize", new Google.Apis.Discovery.Parameter
                        {
                            Name = "pageSize",
                            IsRequired = false,
                            ParameterType = "query",
                            DefaultValue = null,
                            Pattern = null,
                        });
                }

            }
        }
        private readonly MonitoredResourceDescriptorsResource monitoredResourceDescriptors;

        /// <summary>Gets the MonitoredResourceDescriptors resource.</summary>
        public virtual MonitoredResourceDescriptorsResource MonitoredResourceDescriptors
        {
            get { return monitoredResourceDescriptors; }
        }

        /// <summary>The "monitoredResourceDescriptors" collection of methods.</summary>
        public class MonitoredResourceDescriptorsResource
        {
            private const string Resource = "monitoredResourceDescriptors";

            /// <summary>The service which this resource belongs to.</summary>
            private readonly Google.Apis.Services.IClientService service;

            /// <summary>Constructs a new resource.</summary>
            public MonitoredResourceDescriptorsResource(Google.Apis.Services.IClientService service)
            {
                this.service = service;

            }


            /// <summary>Gets a single monitored resource descriptor. This method does not require a Stackdriver
            /// account.</summary>
            /// <param name="name">The monitored resource descriptor to get. The format is
            /// "projects/{project_id_or_number}/monitoredResourceDescriptors/{resource_type}". The {resource_type} is a predefined
            /// type, such as cloudsql_database.</param>
            public virtual GetRequest Get(string name)
            {
                return new GetRequest(service, name);
            }

            /// <summary>Gets a single monitored resource descriptor. This method does not require a Stackdriver
            /// account.</summary>
            public class GetRequest : MonitoringBaseServiceRequest<Google.Apis.Monitoring.v3.Data.MonitoredResourceDescriptor>
            {
                /// <summary>Constructs a new Get request.</summary>
                public GetRequest(Google.Apis.Services.IClientService service, string name)
                    : base(service)
                {
                    Name = name;
                    InitParameters();
                }


                /// <summary>The monitored resource descriptor to get. The format is
                /// "projects/{project_id_or_number}/monitoredResourceDescriptors/{resource_type}". The {resource_type}
                /// is a predefined type, such as cloudsql_database.</summary>
                [Google.Apis.Util.RequestParameterAttribute("name", Google.Apis.Util.RequestParameterType.Path)]
                public virtual string Name { get; private set; }


                ///<summary>Gets the method name.</summary>
                public override string MethodName
                {
                    get { return "get"; }
                }

                ///<summary>Gets the HTTP method.</summary>
                public override string HttpMethod
                {
                    get { return "GET"; }
                }

                ///<summary>Gets the REST path.</summary>
                public override string RestPath
                {
                    get { return "v3/{+name}"; }
                }

                /// <summary>Initializes Get parameter list.</summary>
                protected override void InitParameters()
                {
                    base.InitParameters();

                    RequestParameters.Add(
                        "name", new Google.Apis.Discovery.Parameter
                        {
                            Name = "name",
                            IsRequired = true,
                            ParameterType = "path",
                            DefaultValue = null,
                            Pattern = @"^projects/[^/]+/monitoredResourceDescriptors/[^/]+$",
                        });
                }

            }

            /// <summary>Lists monitored resource descriptors that match a filter. This method does not require a
            /// Stackdriver account.</summary>
            /// <param name="name">The project on which to execute the request. The format is
            /// "projects/{project_id_or_number}".</param>
            public virtual ListRequest List(string name)
            {
                return new ListRequest(service, name);
            }

            /// <summary>Lists monitored resource descriptors that match a filter. This method does not require a
            /// Stackdriver account.</summary>
            public class ListRequest : MonitoringBaseServiceRequest<Google.Apis.Monitoring.v3.Data.ListMonitoredResourceDescriptorsResponse>
            {
                /// <summary>Constructs a new List request.</summary>
                public ListRequest(Google.Apis.Services.IClientService service, string name)
                    : base(service)
                {
                    Name = name;
                    InitParameters();
                }


                /// <summary>The project on which to execute the request. The format is
                /// "projects/{project_id_or_number}".</summary>
                [Google.Apis.Util.RequestParameterAttribute("name", Google.Apis.Util.RequestParameterType.Path)]
                public virtual string Name { get; private set; }

                /// <summary>A positive number that is the maximum number of results to return.</summary>
                [Google.Apis.Util.RequestParameterAttribute("pageSize", Google.Apis.Util.RequestParameterType.Query)]
                public virtual System.Nullable<int> PageSize { get; set; }

                /// <summary>An optional filter describing the descriptors to be returned. The filter can reference the
                /// descriptor's type and labels. For example, the following filter returns only Google Compute Engine
                /// descriptors that have an id label: resource.type = starts_with("gce_") AND resource.label:id
                /// </summary>
                [Google.Apis.Util.RequestParameterAttribute("filter", Google.Apis.Util.RequestParameterType.Query)]
                public virtual string Filter { get; set; }

                /// <summary>If this field is not empty then it must contain the nextPageToken value returned by a
                /// previous call to this method. Using this field causes the method to return additional results from
                /// the previous method call.</summary>
                [Google.Apis.Util.RequestParameterAttribute("pageToken", Google.Apis.Util.RequestParameterType.Query)]
                public virtual string PageToken { get; set; }


                ///<summary>Gets the method name.</summary>
                public override string MethodName
                {
                    get { return "list"; }
                }

                ///<summary>Gets the HTTP method.</summary>
                public override string HttpMethod
                {
                    get { return "GET"; }
                }

                ///<summary>Gets the REST path.</summary>
                public override string RestPath
                {
                    get { return "v3/{+name}/monitoredResourceDescriptors"; }
                }

                /// <summary>Initializes List parameter list.</summary>
                protected override void InitParameters()
                {
                    base.InitParameters();

                    RequestParameters.Add(
                        "name", new Google.Apis.Discovery.Parameter
                        {
                            Name = "name",
                            IsRequired = true,
                            ParameterType = "path",
                            DefaultValue = null,
                            Pattern = @"^projects/[^/]+$",
                        });
                    RequestParameters.Add(
                        "pageSize", new Google.Apis.Discovery.Parameter
                        {
                            Name = "pageSize",
                            IsRequired = false,
                            ParameterType = "query",
                            DefaultValue = null,
                            Pattern = null,
                        });
                    RequestParameters.Add(
                        "filter", new Google.Apis.Discovery.Parameter
                        {
                            Name = "filter",
                            IsRequired = false,
                            ParameterType = "query",
                            DefaultValue = null,
                            Pattern = null,
                        });
                    RequestParameters.Add(
                        "pageToken", new Google.Apis.Discovery.Parameter
                        {
                            Name = "pageToken",
                            IsRequired = false,
                            ParameterType = "query",
                            DefaultValue = null,
                            Pattern = null,
                        });
                }

            }
        }
        private readonly TimeSeriesResource timeSeries;

        /// <summary>Gets the TimeSeries resource.</summary>
        public virtual TimeSeriesResource TimeSeries
        {
            get { return timeSeries; }
        }

        /// <summary>The "timeSeries" collection of methods.</summary>
        public class TimeSeriesResource
        {
            private const string Resource = "timeSeries";

            /// <summary>The service which this resource belongs to.</summary>
            private readonly Google.Apis.Services.IClientService service;

            /// <summary>Constructs a new resource.</summary>
            public TimeSeriesResource(Google.Apis.Services.IClientService service)
            {
                this.service = service;

            }


            /// <summary>Creates or adds data to one or more time series. The response is empty if all time series in
            /// the request were written. If any time series could not be written, a corresponding failure message is
            /// included in the error response.</summary>
            /// <param name="body">The body of the request.</param>
            /// <param name="name">The project on which to execute the request. The format is
            /// "projects/{project_id_or_number}".</param>
            public virtual CreateRequest Create(Google.Apis.Monitoring.v3.Data.CreateTimeSeriesRequest body, string name)
            {
                return new CreateRequest(service, body, name);
            }

            /// <summary>Creates or adds data to one or more time series. The response is empty if all time series in
            /// the request were written. If any time series could not be written, a corresponding failure message is
            /// included in the error response.</summary>
            public class CreateRequest : MonitoringBaseServiceRequest<Google.Apis.Monitoring.v3.Data.Empty>
            {
                /// <summary>Constructs a new Create request.</summary>
                public CreateRequest(Google.Apis.Services.IClientService service, Google.Apis.Monitoring.v3.Data.CreateTimeSeriesRequest body, string name)
                    : base(service)
                {
                    Name = name;
                    Body = body;
                    InitParameters();
                }


                /// <summary>The project on which to execute the request. The format is
                /// "projects/{project_id_or_number}".</summary>
                [Google.Apis.Util.RequestParameterAttribute("name", Google.Apis.Util.RequestParameterType.Path)]
                public virtual string Name { get; private set; }


                /// <summary>Gets or sets the body of this request.</summary>
                Google.Apis.Monitoring.v3.Data.CreateTimeSeriesRequest Body { get; set; }

                ///<summary>Returns the body of the request.</summary>
                protected override object GetBody() { return Body; }

                ///<summary>Gets the method name.</summary>
                public override string MethodName
                {
                    get { return "create"; }
                }

                ///<summary>Gets the HTTP method.</summary>
                public override string HttpMethod
                {
                    get { return "POST"; }
                }

                ///<summary>Gets the REST path.</summary>
                public override string RestPath
                {
                    get { return "v3/{+name}/timeSeries"; }
                }

                /// <summary>Initializes Create parameter list.</summary>
                protected override void InitParameters()
                {
                    base.InitParameters();

                    RequestParameters.Add(
                        "name", new Google.Apis.Discovery.Parameter
                        {
                            Name = "name",
                            IsRequired = true,
                            ParameterType = "path",
                            DefaultValue = null,
                            Pattern = @"^projects/[^/]+$",
                        });
                }

            }

            /// <summary>Lists time series that match a filter. This method does not require a Stackdriver
            /// account.</summary>
            /// <param name="name">The project on which to execute the request. The format is
            /// "projects/{project_id_or_number}".</param>
            public virtual ListRequest List(string name)
            {
                return new ListRequest(service, name);
            }

            /// <summary>Lists time series that match a filter. This method does not require a Stackdriver
            /// account.</summary>
            public class ListRequest : MonitoringBaseServiceRequest<Google.Apis.Monitoring.v3.Data.ListTimeSeriesResponse>
            {
                /// <summary>Constructs a new List request.</summary>
                public ListRequest(Google.Apis.Services.IClientService service, string name)
                    : base(service)
                {
                    Name = name;
                    InitParameters();
                }


                /// <summary>The project on which to execute the request. The format is
                /// "projects/{project_id_or_number}".</summary>
                [Google.Apis.Util.RequestParameterAttribute("name", Google.Apis.Util.RequestParameterType.Path)]
                public virtual string Name { get; private set; }

                /// <summary>A monitoring filter that specifies which time series should be returned. The filter must
                /// specify a single metric type, and can additionally specify metric labels and other information. For
                /// example: metric.type = "compute.googleapis.com/instance/cpu/usage_time" AND
                /// metric.label.instance_name = "my-instance-name" </summary>
                [Google.Apis.Util.RequestParameterAttribute("filter", Google.Apis.Util.RequestParameterType.Query)]
                public virtual string Filter { get; set; }

                /// <summary>If this field is not empty then it must contain the nextPageToken value returned by a
                /// previous call to this method. Using this field causes the method to return additional results from
                /// the previous method call.</summary>
                [Google.Apis.Util.RequestParameterAttribute("pageToken", Google.Apis.Util.RequestParameterType.Query)]
                public virtual string PageToken { get; set; }

                /// <summary>The approach to be used to align individual time series. Not all alignment functions may be
                /// applied to all time series, depending on the metric type and value type of the original time series.
                /// Alignment may change the metric type or the value type of the time series.Time series data must be
                /// aligned in order to perform cross-time series reduction. If crossSeriesReducer is specified, then
                /// perSeriesAligner must be specified and not equal ALIGN_NONE and alignmentPeriod must be specified;
                /// otherwise, an error is returned.</summary>
                [Google.Apis.Util.RequestParameterAttribute("aggregation.perSeriesAligner", Google.Apis.Util.RequestParameterType.Query)]
                public virtual System.Nullable<AggregationPerSeriesAlignerEnum> AggregationPerSeriesAligner { get; set; }

                /// <summary>The approach to be used to align individual time series. Not all alignment functions may be
                /// applied to all time series, depending on the metric type and value type of the original time series.
                /// Alignment may change the metric type or the value type of the time series.Time series data must be
                /// aligned in order to perform cross-time series reduction. If crossSeriesReducer is specified, then
                /// perSeriesAligner must be specified and not equal ALIGN_NONE and alignmentPeriod must be specified;
                /// otherwise, an error is returned.</summary>
                public enum AggregationPerSeriesAlignerEnum
                {
                    [Google.Apis.Util.StringValueAttribute("ALIGN_NONE")]
                    ALIGNNONE,
                    [Google.Apis.Util.StringValueAttribute("ALIGN_DELTA")]
                    ALIGNDELTA,
                    [Google.Apis.Util.StringValueAttribute("ALIGN_RATE")]
                    ALIGNRATE,
                    [Google.Apis.Util.StringValueAttribute("ALIGN_INTERPOLATE")]
                    ALIGNINTERPOLATE,
                    [Google.Apis.Util.StringValueAttribute("ALIGN_NEXT_OLDER")]
                    ALIGNNEXTOLDER,
                    [Google.Apis.Util.StringValueAttribute("ALIGN_MIN")]
                    ALIGNMIN,
                    [Google.Apis.Util.StringValueAttribute("ALIGN_MAX")]
                    ALIGNMAX,
                    [Google.Apis.Util.StringValueAttribute("ALIGN_MEAN")]
                    ALIGNMEAN,
                    [Google.Apis.Util.StringValueAttribute("ALIGN_COUNT")]
                    ALIGNCOUNT,
                    [Google.Apis.Util.StringValueAttribute("ALIGN_SUM")]
                    ALIGNSUM,
                    [Google.Apis.Util.StringValueAttribute("ALIGN_STDDEV")]
                    ALIGNSTDDEV,
                    [Google.Apis.Util.StringValueAttribute("ALIGN_COUNT_TRUE")]
                    ALIGNCOUNTTRUE,
                    [Google.Apis.Util.StringValueAttribute("ALIGN_FRACTION_TRUE")]
                    ALIGNFRACTIONTRUE,
                    [Google.Apis.Util.StringValueAttribute("ALIGN_PERCENTILE_99")]
                    ALIGNPERCENTILE99,
                    [Google.Apis.Util.StringValueAttribute("ALIGN_PERCENTILE_95")]
                    ALIGNPERCENTILE95,
                    [Google.Apis.Util.StringValueAttribute("ALIGN_PERCENTILE_50")]
                    ALIGNPERCENTILE50,
                    [Google.Apis.Util.StringValueAttribute("ALIGN_PERCENTILE_05")]
                    ALIGNPERCENTILE05,
                }

                /// <summary>Optional. The beginning of the time interval. The default value for the start time is the
                /// end time. The start time must not be later than the end time.</summary>
                [Google.Apis.Util.RequestParameterAttribute("interval.startTime", Google.Apis.Util.RequestParameterType.Query)]
                public virtual object IntervalStartTime { get; set; }

                /// <summary>Specifies which information is returned about the time series.</summary>
                [Google.Apis.Util.RequestParameterAttribute("view", Google.Apis.Util.RequestParameterType.Query)]
                public virtual System.Nullable<ViewEnum> View { get; set; }

                /// <summary>Specifies which information is returned about the time series.</summary>
                public enum ViewEnum
                {
                    [Google.Apis.Util.StringValueAttribute("FULL")]
                    FULL,
                    [Google.Apis.Util.StringValueAttribute("HEADERS")]
                    HEADERS,
                }

                /// <summary>The set of fields to preserve when crossSeriesReducer is specified. The groupByFields
                /// determine how the time series are partitioned into subsets prior to applying the aggregation
                /// function. Each subset contains time series that have the same value for each of the grouping fields.
                /// Each individual time series is a member of exactly one subset. The crossSeriesReducer is applied to
                /// each subset of time series. It is not possible to reduce across different resource types, so this
                /// field implicitly contains resource.type. Fields not specified in groupByFields are aggregated away.
                /// If groupByFields is not specified and all the time series have the same resource type, then the time
                /// series are aggregated into a single output time series. If crossSeriesReducer is not defined, this
                /// field is ignored.</summary>
                [Google.Apis.Util.RequestParameterAttribute("aggregation.groupByFields", Google.Apis.Util.RequestParameterType.Query)]
                public virtual Google.Apis.Util.Repeatable<string> AggregationGroupByFields { get; set; }

                /// <summary>Required. The end of the time interval.</summary>
                [Google.Apis.Util.RequestParameterAttribute("interval.endTime", Google.Apis.Util.RequestParameterType.Query)]
                public virtual object IntervalEndTime { get; set; }

                /// <summary>The alignment period for per-time series alignment. If present, alignmentPeriod must be at
                /// least 60 seconds. After per-time series alignment, each time series will contain data points only on
                /// the period boundaries. If perSeriesAligner is not specified or equals ALIGN_NONE, then this field is
                /// ignored. If perSeriesAligner is specified and does not equal ALIGN_NONE, then this field must be
                /// defined; otherwise an error is returned.</summary>
                [Google.Apis.Util.RequestParameterAttribute("aggregation.alignmentPeriod", Google.Apis.Util.RequestParameterType.Query)]
                public virtual object AggregationAlignmentPeriod { get; set; }

                /// <summary>A positive number that is the maximum number of results to return. When view field sets to
                /// FULL, it limits the number of Points server will return; if view field is HEADERS, it limits the
                /// number of TimeSeries server will return.</summary>
                [Google.Apis.Util.RequestParameterAttribute("pageSize", Google.Apis.Util.RequestParameterType.Query)]
                public virtual System.Nullable<int> PageSize { get; set; }

                /// <summary>Specifies the order in which the points of the time series should be returned. By default,
                /// results are not ordered. Currently, this field must be left blank.</summary>
                [Google.Apis.Util.RequestParameterAttribute("orderBy", Google.Apis.Util.RequestParameterType.Query)]
                public virtual string OrderBy { get; set; }

                /// <summary>The approach to be used to combine time series. Not all reducer functions may be applied to
                /// all time series, depending on the metric type and the value type of the original time series.
                /// Reduction may change the metric type of value type of the time series.Time series data must be
                /// aligned in order to perform cross-time series reduction. If crossSeriesReducer is specified, then
                /// perSeriesAligner must be specified and not equal ALIGN_NONE and alignmentPeriod must be specified;
                /// otherwise, an error is returned.</summary>
                [Google.Apis.Util.RequestParameterAttribute("aggregation.crossSeriesReducer", Google.Apis.Util.RequestParameterType.Query)]
                public virtual System.Nullable<AggregationCrossSeriesReducerEnum> AggregationCrossSeriesReducer { get; set; }

                /// <summary>The approach to be used to combine time series. Not all reducer functions may be applied to
                /// all time series, depending on the metric type and the value type of the original time series.
                /// Reduction may change the metric type of value type of the time series.Time series data must be
                /// aligned in order to perform cross-time series reduction. If crossSeriesReducer is specified, then
                /// perSeriesAligner must be specified and not equal ALIGN_NONE and alignmentPeriod must be specified;
                /// otherwise, an error is returned.</summary>
                public enum AggregationCrossSeriesReducerEnum
                {
                    [Google.Apis.Util.StringValueAttribute("REDUCE_NONE")]
                    REDUCENONE,
                    [Google.Apis.Util.StringValueAttribute("REDUCE_MEAN")]
                    REDUCEMEAN,
                    [Google.Apis.Util.StringValueAttribute("REDUCE_MIN")]
                    REDUCEMIN,
                    [Google.Apis.Util.StringValueAttribute("REDUCE_MAX")]
                    REDUCEMAX,
                    [Google.Apis.Util.StringValueAttribute("REDUCE_SUM")]
                    REDUCESUM,
                    [Google.Apis.Util.StringValueAttribute("REDUCE_STDDEV")]
                    REDUCESTDDEV,
                    [Google.Apis.Util.StringValueAttribute("REDUCE_COUNT")]
                    REDUCECOUNT,
                    [Google.Apis.Util.StringValueAttribute("REDUCE_COUNT_TRUE")]
                    REDUCECOUNTTRUE,
                    [Google.Apis.Util.StringValueAttribute("REDUCE_FRACTION_TRUE")]
                    REDUCEFRACTIONTRUE,
                    [Google.Apis.Util.StringValueAttribute("REDUCE_PERCENTILE_99")]
                    REDUCEPERCENTILE99,
                    [Google.Apis.Util.StringValueAttribute("REDUCE_PERCENTILE_95")]
                    REDUCEPERCENTILE95,
                    [Google.Apis.Util.StringValueAttribute("REDUCE_PERCENTILE_50")]
                    REDUCEPERCENTILE50,
                    [Google.Apis.Util.StringValueAttribute("REDUCE_PERCENTILE_05")]
                    REDUCEPERCENTILE05,
                }


                ///<summary>Gets the method name.</summary>
                public override string MethodName
                {
                    get { return "list"; }
                }

                ///<summary>Gets the HTTP method.</summary>
                public override string HttpMethod
                {
                    get { return "GET"; }
                }

                ///<summary>Gets the REST path.</summary>
                public override string RestPath
                {
                    get { return "v3/{+name}/timeSeries"; }
                }

                /// <summary>Initializes List parameter list.</summary>
                protected override void InitParameters()
                {
                    base.InitParameters();

                    RequestParameters.Add(
                        "name", new Google.Apis.Discovery.Parameter
                        {
                            Name = "name",
                            IsRequired = true,
                            ParameterType = "path",
                            DefaultValue = null,
                            Pattern = @"^projects/[^/]+$",
                        });
                    RequestParameters.Add(
                        "filter", new Google.Apis.Discovery.Parameter
                        {
                            Name = "filter",
                            IsRequired = false,
                            ParameterType = "query",
                            DefaultValue = null,
                            Pattern = null,
                        });
                    RequestParameters.Add(
                        "pageToken", new Google.Apis.Discovery.Parameter
                        {
                            Name = "pageToken",
                            IsRequired = false,
                            ParameterType = "query",
                            DefaultValue = null,
                            Pattern = null,
                        });
                    RequestParameters.Add(
                        "aggregation.perSeriesAligner", new Google.Apis.Discovery.Parameter
                        {
                            Name = "aggregation.perSeriesAligner",
                            IsRequired = false,
                            ParameterType = "query",
                            DefaultValue = null,
                            Pattern = null,
                        });
                    RequestParameters.Add(
                        "interval.startTime", new Google.Apis.Discovery.Parameter
                        {
                            Name = "interval.startTime",
                            IsRequired = false,
                            ParameterType = "query",
                            DefaultValue = null,
                            Pattern = null,
                        });
                    RequestParameters.Add(
                        "view", new Google.Apis.Discovery.Parameter
                        {
                            Name = "view",
                            IsRequired = false,
                            ParameterType = "query",
                            DefaultValue = null,
                            Pattern = null,
                        });
                    RequestParameters.Add(
                        "aggregation.groupByFields", new Google.Apis.Discovery.Parameter
                        {
                            Name = "aggregation.groupByFields",
                            IsRequired = false,
                            ParameterType = "query",
                            DefaultValue = null,
                            Pattern = null,
                        });
                    RequestParameters.Add(
                        "interval.endTime", new Google.Apis.Discovery.Parameter
                        {
                            Name = "interval.endTime",
                            IsRequired = false,
                            ParameterType = "query",
                            DefaultValue = null,
                            Pattern = null,
                        });
                    RequestParameters.Add(
                        "aggregation.alignmentPeriod", new Google.Apis.Discovery.Parameter
                        {
                            Name = "aggregation.alignmentPeriod",
                            IsRequired = false,
                            ParameterType = "query",
                            DefaultValue = null,
                            Pattern = null,
                        });
                    RequestParameters.Add(
                        "pageSize", new Google.Apis.Discovery.Parameter
                        {
                            Name = "pageSize",
                            IsRequired = false,
                            ParameterType = "query",
                            DefaultValue = null,
                            Pattern = null,
                        });
                    RequestParameters.Add(
                        "orderBy", new Google.Apis.Discovery.Parameter
                        {
                            Name = "orderBy",
                            IsRequired = false,
                            ParameterType = "query",
                            DefaultValue = null,
                            Pattern = null,
                        });
                    RequestParameters.Add(
                        "aggregation.crossSeriesReducer", new Google.Apis.Discovery.Parameter
                        {
                            Name = "aggregation.crossSeriesReducer",
                            IsRequired = false,
                            ParameterType = "query",
                            DefaultValue = null,
                            Pattern = null,
                        });
                }

            }
        }
    }
}

namespace Google.Apis.Monitoring.v3.Data
{    

    /// <summary>A Distribution may optionally contain a histogram of the values in the population. The histogram is
    /// given in bucket_counts as counts of values that fall into one of a sequence of non-overlapping buckets. The
    /// sequence of buckets is described by bucket_options.A bucket specifies an inclusive lower bound and exclusive
    /// upper bound for the values that are counted for that bucket. The upper bound of a bucket is strictly greater
    /// than the lower bound.The sequence of N buckets for a Distribution consists of an underflow bucket (number 0),
    /// zero or more finite buckets (number 1 through N - 2) and an overflow bucket (number N - 1). The buckets are
    /// contiguous: the lower bound of bucket i (i > 0) is the same as the upper bound of bucket i - 1. The buckets span
    /// the whole range of finite values: lower bound of the underflow bucket is -infinity and the upper bound of the
    /// overflow bucket is +infinity. The finite buckets are so-called because both bounds are finite.BucketOptions
    /// describes bucket boundaries in one of three ways. Two describe the boundaries by giving parameters for a formula
    /// to generate boundaries and one gives the bucket boundaries explicitly.If bucket_options is not given, then no
    /// bucket_counts may be given.</summary>
    public class BucketOptions : Google.Apis.Requests.IDirectResponseSchema
    {
        /// <summary>The explicit buckets.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("explicitBuckets")]
        public virtual Explicit ExplicitBuckets { get; set; } 

        /// <summary>The exponential buckets.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("exponentialBuckets")]
        public virtual Exponential ExponentialBuckets { get; set; } 

        /// <summary>The linear bucket.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("linearBuckets")]
        public virtual Linear LinearBuckets { get; set; } 

        /// <summary>The ETag of the item.</summary>
        public virtual string ETag { get; set; }
    }    

    /// <summary>A collection of data points sent from a collectd-based plugin. See the collectd documentation for more
    /// information.</summary>
    public class CollectdPayload : Google.Apis.Requests.IDirectResponseSchema
    {
        /// <summary>The end time of the interval.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("endTime")]
        public virtual object EndTime { get; set; } 

        /// <summary>The measurement metadata. Example: "process_id" -> 12345</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("metadata")]
        public virtual System.Collections.Generic.IDictionary<string,TypedValue> Metadata { get; set; } 

        /// <summary>The name of the plugin. Example: "disk".</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("plugin")]
        public virtual string Plugin { get; set; } 

        /// <summary>The instance name of the plugin Example: "hdcl".</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("pluginInstance")]
        public virtual string PluginInstance { get; set; } 

        /// <summary>The start time of the interval.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("startTime")]
        public virtual object StartTime { get; set; } 

        /// <summary>The measurement type. Example: "memory".</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("type")]
        public virtual string Type { get; set; } 

        /// <summary>The measurement type instance. Example: "used".</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("typeInstance")]
        public virtual string TypeInstance { get; set; } 

        /// <summary>The measured values during this time interval. Each value must have a different
        /// dataSourceName.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("values")]
        public virtual System.Collections.Generic.IList<CollectdValue> Values { get; set; } 

        /// <summary>The ETag of the item.</summary>
        public virtual string ETag { get; set; }
    }    

    /// <summary>A single data point from a collectd-based plugin.</summary>
    public class CollectdValue : Google.Apis.Requests.IDirectResponseSchema
    {
        /// <summary>The data source for the collectd value. For example there are two data sources for network
        /// measurements: "rx" and "tx".</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("dataSourceName")]
        public virtual string DataSourceName { get; set; } 

        /// <summary>The type of measurement.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("dataSourceType")]
        public virtual string DataSourceType { get; set; } 

        /// <summary>The measurement value.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("value")]
        public virtual TypedValue Value { get; set; } 

        /// <summary>The ETag of the item.</summary>
        public virtual string ETag { get; set; }
    }    

    /// <summary>The CreateCollectdTimeSeries request.</summary>
    public class CreateCollectdTimeSeriesRequest : Google.Apis.Requests.IDirectResponseSchema
    {
        /// <summary>The collectd payloads representing the time series data. You must not include more than a single
        /// point for each time series, so no two payloads can have the same values for all of the fields plugin,
        /// plugin_instance, type, and type_instance.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("collectdPayloads")]
        public virtual System.Collections.Generic.IList<CollectdPayload> CollectdPayloads { get; set; } 

        /// <summary>The version of collectd that collected the data. Example: "5.3.0-192.el6".</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("collectdVersion")]
        public virtual string CollectdVersion { get; set; } 

        /// <summary>The monitored resource associated with the time series.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("resource")]
        public virtual MonitoredResource Resource { get; set; } 

        /// <summary>The ETag of the item.</summary>
        public virtual string ETag { get; set; }
    }    

    /// <summary>The CreateTimeSeries request.</summary>
    public class CreateTimeSeriesRequest : Google.Apis.Requests.IDirectResponseSchema
    {
        /// <summary>The new data to be added to a list of time series. Adds at most one data point to each of several
        /// time series. The new data point must be more recent than any other point in its time series. Each TimeSeries
        /// value must fully specify a unique time series by supplying all label values for the metric and the monitored
        /// resource.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("timeSeries")]
        public virtual System.Collections.Generic.IList<TimeSeries> TimeSeries { get; set; } 

        /// <summary>The ETag of the item.</summary>
        public virtual string ETag { get; set; }
    }    

    /// <summary>Distribution contains summary statistics for a population of values and, optionally, a histogram
    /// representing the distribution of those values across a specified set of histogram buckets.The summary statistics
    /// are the count, mean, sum of the squared deviation from the mean, the minimum, and the maximum of the set of
    /// population of values.The histogram is based on a sequence of buckets and gives a count of values that fall into
    /// each bucket. The boundaries of the buckets are given either explicitly or by specifying parameters for a method
    /// of computing them (buckets of fixed width or buckets of exponentially increasing width).Although it is not
    /// forbidden, it is generally a bad idea to include non-finite values (infinities or NaNs) in the population of
    /// values, as this will render the mean and sum_of_squared_deviation fields meaningless.</summary>
    public class Distribution : Google.Apis.Requests.IDirectResponseSchema
    {
        /// <summary>If bucket_options is given, then the sum of the values in bucket_counts must equal the value in
        /// count. If bucket_options is not given, no bucket_counts fields may be given.Bucket counts are given in order
        /// under the numbering scheme described above (the underflow bucket has number 0; the finite buckets, if any,
        /// have numbers 1 through N-2; the overflow bucket has number N-1).The size of bucket_counts must be no greater
        /// than N as defined in bucket_options.Any suffix of trailing zero bucket_count fields may be
        /// omitted.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("bucketCounts")]
        public virtual System.Collections.Generic.IList<System.Nullable<long>> BucketCounts { get; set; } 

        /// <summary>Defines the histogram bucket boundaries.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("bucketOptions")]
        public virtual BucketOptions BucketOptions { get; set; } 

        /// <summary>The number of values in the population. Must be non-negative.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("count")]
        public virtual System.Nullable<long> Count { get; set; } 

        /// <summary>The arithmetic mean of the values in the population. If count is zero then this field must be
        /// zero.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("mean")]
        public virtual System.Nullable<double> Mean { get; set; } 

        /// <summary>If specified, contains the range of the population values. The field must not be present if the
        /// count is zero. This field is presently ignored by the Stackdriver Monitoring API v3.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("range")]
        public virtual Range Range { get; set; } 

        /// <summary>The sum of squared deviations from the mean of the values in the population. For values x_i this
        /// is: Sum[i=1..n]((x_i - mean)^2) Knuth, "The Art of Computer Programming", Vol. 2, page 323, 3rd edition
        /// describes Welford's method for accumulating this sum in one pass.If count is zero then this field must be
        /// zero.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("sumOfSquaredDeviation")]
        public virtual System.Nullable<double> SumOfSquaredDeviation { get; set; } 

        /// <summary>The ETag of the item.</summary>
        public virtual string ETag { get; set; }
    }    

    /// <summary>A generic empty message that you can re-use to avoid defining duplicated empty messages in your APIs. A
    /// typical example is to use it as the request or the response type of an API method. For instance: service Foo {
    /// rpc Bar(google.protobuf.Empty) returns (google.protobuf.Empty); } The JSON representation for Empty is empty
    /// JSON object {}.</summary>
    public class Empty : Google.Apis.Requests.IDirectResponseSchema
    {
        /// <summary>The ETag of the item.</summary>
        public virtual string ETag { get; set; }
    }    

    /// <summary>A set of buckets with arbitrary widths.Defines size(bounds) + 1 (= N) buckets with these boundaries for
    /// bucket i:Upper bound (0 <= i < N-1): boundsi  Lower bound (1 <= i < N); boundsi - 1There must be at least one
    /// element in bounds. If bounds has only one element, there are no finite buckets, and that single element is the
    /// common boundary of the overflow and underflow buckets.</summary>
    public class Explicit : Google.Apis.Requests.IDirectResponseSchema
    {
        /// <summary>The values must be monotonically increasing.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("bounds")]
        public virtual System.Collections.Generic.IList<System.Nullable<double>> Bounds { get; set; } 

        /// <summary>The ETag of the item.</summary>
        public virtual string ETag { get; set; }
    }    

    /// <summary>Specify a sequence of buckets that have a width that is proportional to the value of the lower bound.
    /// Each bucket represents a constant relative uncertainty on a specific value in the bucket.Defines
    /// num_finite_buckets + 2 (= N) buckets with these boundaries for bucket i:Upper bound (0 <= i < N-1): scale *
    /// (growth_factor ^ i).  Lower bound (1 <= i < N): scale * (growth_factor ^ (i - 1)).</summary>
    public class Exponential : Google.Apis.Requests.IDirectResponseSchema
    {
        /// <summary>Must be greater than 1.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("growthFactor")]
        public virtual System.Nullable<double> GrowthFactor { get; set; } 

        /// <summary>Must be greater than 0.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("numFiniteBuckets")]
        public virtual System.Nullable<int> NumFiniteBuckets { get; set; } 

        /// <summary>Must be greater than 0.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("scale")]
        public virtual System.Nullable<double> Scale { get; set; } 

        /// <summary>The ETag of the item.</summary>
        public virtual string ETag { get; set; }
    }    

    /// <summary>A single field of a message type.</summary>
    public class Field : Google.Apis.Requests.IDirectResponseSchema
    {
        /// <summary>The field cardinality.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("cardinality")]
        public virtual string Cardinality { get; set; } 

        /// <summary>The string value of the default value of this field. Proto2 syntax only.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("defaultValue")]
        public virtual string DefaultValue { get; set; } 

        /// <summary>The field JSON name.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("jsonName")]
        public virtual string JsonName { get; set; } 

        /// <summary>The field type.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("kind")]
        public virtual string Kind { get; set; } 

        /// <summary>The field name.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("name")]
        public virtual string Name { get; set; } 

        /// <summary>The field number.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("number")]
        public virtual System.Nullable<int> Number { get; set; } 

        /// <summary>The index of the field type in Type.oneofs, for message or enumeration types. The first type has
        /// index 1; zero means the type is not in the list.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("oneofIndex")]
        public virtual System.Nullable<int> OneofIndex { get; set; } 

        /// <summary>The protocol buffer options.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("options")]
        public virtual System.Collections.Generic.IList<Option> Options { get; set; } 

        /// <summary>Whether to use alternative packed wire representation.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("packed")]
        public virtual System.Nullable<bool> Packed { get; set; } 

        /// <summary>The field type URL, without the scheme, for message or enumeration types. Example:
        /// "type.googleapis.com/google.protobuf.Timestamp".</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("typeUrl")]
        public virtual string TypeUrl { get; set; } 

        /// <summary>The ETag of the item.</summary>
        public virtual string ETag { get; set; }
    }    

    /// <summary>The description of a dynamic collection of monitored resources. Each group has a filter that is matched
    /// against monitored resources and their associated metadata. If a group's filter matches an available monitored
    /// resource, then that resource is a member of that group. Groups can contain any number of monitored resources,
    /// and each monitored resource can be a member of any number of groups.Groups can be nested in parent-child
    /// hierarchies. The parentName field identifies an optional parent for each group. If a group has a parent, then
    /// the only monitored resources available to be matched by the group's filter are the resources contained in the
    /// parent group. In other words, a group contains the monitored resources that match its filter and the filters of
    /// all the group's ancestors. A group without a parent can contain any monitored resource.For example, consider an
    /// infrastructure running a set of instances with two user-defined tags: "environment" and "role". A parent group
    /// has a filter, environment="production". A child of that parent group has a filter, role="transcoder". The parent
    /// group contains all instances in the production environment, regardless of their roles. The child group contains
    /// instances that have the transcoder role and are in the production environment.The monitored resources contained
    /// in a group can change at any moment, depending on what resources exist and what filters are associated with the
    /// group and its ancestors.</summary>
    public class Group : Google.Apis.Requests.IDirectResponseSchema
    {
        /// <summary>A user-assigned name for this group, used only for display purposes.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("displayName")]
        public virtual string DisplayName { get; set; } 

        /// <summary>The filter used to determine which monitored resources belong to this group.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("filter")]
        public virtual string Filter { get; set; } 

        /// <summary>If true, the members of this group are considered to be a cluster. The system can perform
        /// additional analysis on groups that are clusters.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("isCluster")]
        public virtual System.Nullable<bool> IsCluster { get; set; } 

        /// <summary>Output only. The name of this group. The format is
        /// "projects/{project_id_or_number}/groups/{group_id}". When creating a group, this field is ignored and a new
        /// name is created consisting of the project specified in the call to CreateGroup and a unique {group_id} that
        /// is generated automatically.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("name")]
        public virtual string Name { get; set; } 

        /// <summary>The name of the group's parent, if it has one. The format is
        /// "projects/{project_id_or_number}/groups/{group_id}". For groups with no parent, parentName is the empty
        /// string, "".</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("parentName")]
        public virtual string ParentName { get; set; } 

        /// <summary>The ETag of the item.</summary>
        public virtual string ETag { get; set; }
    }    

    /// <summary>A description of a label.</summary>
    public class LabelDescriptor : Google.Apis.Requests.IDirectResponseSchema
    {
        /// <summary>A human-readable description for the label.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("description")]
        public virtual string Description { get; set; } 

        /// <summary>The label key.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("key")]
        public virtual string Key { get; set; } 

        /// <summary>The type of data that can be assigned to the label.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("valueType")]
        public virtual string ValueType { get; set; } 

        /// <summary>The ETag of the item.</summary>
        public virtual string ETag { get; set; }
    }    

    /// <summary>Specify a sequence of buckets that all have the same width (except overflow and underflow). Each bucket
    /// represents a constant absolute uncertainty on the specific value in the bucket.Defines num_finite_buckets + 2 (=
    /// N) buckets with these boundaries for bucket i:Upper bound (0 <= i < N-1): offset + (width * i).  Lower bound (1
    /// <= i < N): offset + (width * (i - 1)).</summary>
    public class Linear : Google.Apis.Requests.IDirectResponseSchema
    {
        /// <summary>Must be greater than 0.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("numFiniteBuckets")]
        public virtual System.Nullable<int> NumFiniteBuckets { get; set; } 

        /// <summary>Lower bound of the first bucket.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("offset")]
        public virtual System.Nullable<double> Offset { get; set; } 

        /// <summary>Must be greater than 0.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("width")]
        public virtual System.Nullable<double> Width { get; set; } 

        /// <summary>The ETag of the item.</summary>
        public virtual string ETag { get; set; }
    }    

    /// <summary>The ListGroupMembers response.</summary>
    public class ListGroupMembersResponse : Google.Apis.Requests.IDirectResponseSchema
    {
        /// <summary>A set of monitored resources in the group.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("members")]
        public virtual System.Collections.Generic.IList<MonitoredResource> Members { get; set; } 

        /// <summary>If there are more results than have been returned, then this field is set to a non-empty value. To
        /// see the additional results, use that value as pageToken in the next call to this method.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("nextPageToken")]
        public virtual string NextPageToken { get; set; } 

        /// <summary>The total number of elements matching this request.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("totalSize")]
        public virtual System.Nullable<int> TotalSize { get; set; } 

        /// <summary>The ETag of the item.</summary>
        public virtual string ETag { get; set; }
    }    

    /// <summary>The ListGroups response.</summary>
    public class ListGroupsResponse : Google.Apis.Requests.IDirectResponseSchema
    {
        /// <summary>The groups that match the specified filters.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("group")]
        public virtual System.Collections.Generic.IList<Group> Group { get; set; } 

        /// <summary>If there are more results than have been returned, then this field is set to a non-empty value. To
        /// see the additional results, use that value as pageToken in the next call to this method.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("nextPageToken")]
        public virtual string NextPageToken { get; set; } 

        /// <summary>The ETag of the item.</summary>
        public virtual string ETag { get; set; }
    }    

    /// <summary>The ListMetricDescriptors response.</summary>
    public class ListMetricDescriptorsResponse : Google.Apis.Requests.IDirectResponseSchema
    {
        /// <summary>The metric descriptors that are available to the project and that match the value of filter, if
        /// present.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("metricDescriptors")]
        public virtual System.Collections.Generic.IList<MetricDescriptor> MetricDescriptors { get; set; } 

        /// <summary>If there are more results than have been returned, then this field is set to a non-empty value. To
        /// see the additional results, use that value as pageToken in the next call to this method.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("nextPageToken")]
        public virtual string NextPageToken { get; set; } 

        /// <summary>The ETag of the item.</summary>
        public virtual string ETag { get; set; }
    }    

    /// <summary>The ListMonitoredResourcDescriptors response.</summary>
    public class ListMonitoredResourceDescriptorsResponse : Google.Apis.Requests.IDirectResponseSchema
    {
        /// <summary>If there are more results than have been returned, then this field is set to a non-empty value. To
        /// see the additional results, use that value as pageToken in the next call to this method.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("nextPageToken")]
        public virtual string NextPageToken { get; set; } 

        /// <summary>The monitored resource descriptors that are available to this project and that match filter, if
        /// present.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("resourceDescriptors")]
        public virtual System.Collections.Generic.IList<MonitoredResourceDescriptor> ResourceDescriptors { get; set; } 

        /// <summary>The ETag of the item.</summary>
        public virtual string ETag { get; set; }
    }    

    /// <summary>The ListTimeSeries response.</summary>
    public class ListTimeSeriesResponse : Google.Apis.Requests.IDirectResponseSchema
    {
        /// <summary>If there are more results than have been returned, then this field is set to a non-empty value. To
        /// see the additional results, use that value as pageToken in the next call to this method.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("nextPageToken")]
        public virtual string NextPageToken { get; set; } 

        /// <summary>One or more time series that match the filter included in the request.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("timeSeries")]
        public virtual System.Collections.Generic.IList<TimeSeries> TimeSeries { get; set; } 

        /// <summary>The ETag of the item.</summary>
        public virtual string ETag { get; set; }
    }    

    /// <summary>A specific metric, identified by specifying values for all of the labels of a
    /// MetricDescriptor.</summary>
    public class Metric : Google.Apis.Requests.IDirectResponseSchema
    {
        /// <summary>The set of label values that uniquely identify this metric. All labels listed in the
        /// MetricDescriptor must be assigned values.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("labels")]
        public virtual System.Collections.Generic.IDictionary<string,string> Labels { get; set; } 

        /// <summary>An existing metric type, see google.api.MetricDescriptor. For example,
        /// custom.googleapis.com/invoice/paid/amount.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("type")]
        public virtual string Type { get; set; } 

        /// <summary>The ETag of the item.</summary>
        public virtual string ETag { get; set; }
    }    

    /// <summary>Defines a metric type and its schema. Once a metric descriptor is created, deleting or altering it
    /// stops data collection and makes the metric type's existing data unusable.</summary>
    public class MetricDescriptor : Google.Apis.Requests.IDirectResponseSchema
    {
        /// <summary>A detailed description of the metric, which can be used in documentation.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("description")]
        public virtual string Description { get; set; } 

        /// <summary>A concise name for the metric, which can be displayed in user interfaces. Use sentence case without
        /// an ending period, for example "Request count".</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("displayName")]
        public virtual string DisplayName { get; set; } 

        /// <summary>The set of labels that can be used to describe a specific instance of this metric type. For
        /// example, the appengine.googleapis.com/http/server/response_latencies metric type has a label for the HTTP
        /// response code, response_code, so you can look at latencies for successful responses or just for responses
        /// that failed.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("labels")]
        public virtual System.Collections.Generic.IList<LabelDescriptor> Labels { get; set; } 

        /// <summary>Whether the metric records instantaneous values, changes to a value, etc. Some combinations of
        /// metric_kind and value_type might not be supported.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("metricKind")]
        public virtual string MetricKind { get; set; } 

        /// <summary>The resource name of the metric descriptor. Depending on the implementation, the name typically
        /// includes: (1) the parent resource name that defines the scope of the metric type or of its data; and (2) the
        /// metric's URL-encoded type, which also appears in the type field of this descriptor. For example, following
        /// is the resource name of a custom metric within the GCP project my-project-id: "projects/my-project-
        /// id/metricDescriptors/custom.googleapis.com%2Finvoice%2Fpaid%2Famount" </summary>
        [Newtonsoft.Json.JsonPropertyAttribute("name")]
        public virtual string Name { get; set; } 

        /// <summary>The metric type, including its DNS name prefix. The type is not URL-encoded. All user-defined
        /// custom metric types have the DNS name custom.googleapis.com. Metric types should use a natural hierarchical
        /// grouping. For example: "custom.googleapis.com/invoice/paid/amount"
        /// "appengine.googleapis.com/http/server/response_latencies" </summary>
        [Newtonsoft.Json.JsonPropertyAttribute("type")]
        public virtual string Type { get; set; } 

        /// <summary>The unit in which the metric value is reported. It is only applicable if the value_type is INT64,
        /// DOUBLE, or DISTRIBUTION. The supported units are a subset of The Unified Code for Units of Measure
        /// (http://unitsofmeasure.org/ucum.html) standard:Basic units (UNIT) bit bit By byte s second min minute h hour
        /// d dayPrefixes (PREFIX) k kilo (10**3) M mega (10**6) G giga (10**9) T tera (10**12) P peta (10**15) E exa
        /// (10**18) Z zetta (10**21) Y yotta (10**24) m milli (10**-3) u micro (10**-6) n nano (10**-9) p pico
        /// (10**-12) f femto (10**-15) a atto (10**-18) z zepto (10**-21) y yocto (10**-24) Ki kibi (2**10) Mi mebi
        /// (2**20) Gi gibi (2**30) Ti tebi (2**40)GrammarThe grammar includes the dimensionless unit 1, such as 1/s.The
        /// grammar also includes these connectors: / division (as an infix operator, e.g. 1/s). . multiplication (as an
        /// infix operator, e.g. GBy.d)The grammar for a unit is as follows: Expression = Component { "." Component } {
        /// "/" Component } ;
        ///
        /// Component = [ PREFIX ] UNIT [ Annotation ] | Annotation | "1" ;
        ///
        /// Annotation = "{" NAME "}" ; Notes: Annotation is just a comment if it follows a UNIT and is  equivalent to 1
        /// if it is used alone. For examples,  {requests}/s == 1/s, By{transmitted}/s == By/s. NAME is a sequence of
        /// non-blank printable ASCII characters not  containing '{' or '}'.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("unit")]
        public virtual string Unit { get; set; } 

        /// <summary>Whether the measurement is an integer, a floating-point number, etc. Some combinations of
        /// metric_kind and value_type might not be supported.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("valueType")]
        public virtual string ValueType { get; set; } 

        /// <summary>The ETag of the item.</summary>
        public virtual string ETag { get; set; }
    }    

    /// <summary>An object representing a resource that can be used for monitoring, logging, billing, or other purposes.
    /// Examples include virtual machine instances, databases, and storage devices such as disks. The type field
    /// identifies a MonitoredResourceDescriptor object that describes the resource's schema. Information in the labels
    /// field identifies the actual resource and its attributes according to the schema. For example, a particular
    /// Compute Engine VM instance could be represented by the following object, because the MonitoredResourceDescriptor
    /// for "gce_instance" has labels "instance_id" and "zone": { "type": "gce_instance", "labels": { "instance_id":
    /// "12345678901234", "zone": "us-central1-a" }} </summary>
    public class MonitoredResource : Google.Apis.Requests.IDirectResponseSchema
    {
        /// <summary>Required. Values for all of the labels listed in the associated monitored resource descriptor. For
        /// example, Cloud SQL databases use the labels "database_id" and "zone".</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("labels")]
        public virtual System.Collections.Generic.IDictionary<string,string> Labels { get; set; } 

        /// <summary>Required. The monitored resource type. This field must match the type field of a
        /// MonitoredResourceDescriptor object. For example, the type of a Cloud SQL database is
        /// "cloudsql_database".</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("type")]
        public virtual string Type { get; set; } 

        /// <summary>The ETag of the item.</summary>
        public virtual string ETag { get; set; }
    }    

    /// <summary>An object that describes the schema of a MonitoredResource object using a type name and a set of
    /// labels. For example, the monitored resource descriptor for Google Compute Engine VM instances has a type of
    /// "gce_instance" and specifies the use of the labels "instance_id" and "zone" to identify particular VM
    /// instances.Different APIs can support different monitored resource types. APIs generally provide a list method
    /// that returns the monitored resource descriptors used by the API.</summary>
    public class MonitoredResourceDescriptor : Google.Apis.Requests.IDirectResponseSchema
    {
        /// <summary>Optional. A detailed description of the monitored resource type that might be used in
        /// documentation.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("description")]
        public virtual string Description { get; set; } 

        /// <summary>Optional. A concise name for the monitored resource type that might be displayed in user
        /// interfaces. It should be a Title Cased Noun Phrase, without any article or other determiners. For example,
        /// "Google Cloud SQL Database".</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("displayName")]
        public virtual string DisplayName { get; set; } 

        /// <summary>Required. A set of labels used to describe instances of this monitored resource type. For example,
        /// an individual Google Cloud SQL database is identified by values for the labels "database_id" and
        /// "zone".</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("labels")]
        public virtual System.Collections.Generic.IList<LabelDescriptor> Labels { get; set; } 

        /// <summary>Optional. The resource name of the monitored resource descriptor:
        /// "projects/{project_id}/monitoredResourceDescriptors/{type}" where {type} is the value of the type field in
        /// this object and {project_id} is a project ID that provides API-specific context for accessing the type. APIs
        /// that do not use project information can use the resource name format
        /// "monitoredResourceDescriptors/{type}".</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("name")]
        public virtual string Name { get; set; } 

        /// <summary>Required. The monitored resource type. For example, the type "cloudsql_database" represents
        /// databases in Google Cloud SQL. The maximum length of this value is 256 characters.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("type")]
        public virtual string Type { get; set; } 

        /// <summary>The ETag of the item.</summary>
        public virtual string ETag { get; set; }
    }    

    /// <summary>A protocol buffer option, which can be attached to a message, field, enumeration, etc.</summary>
    public class Option : Google.Apis.Requests.IDirectResponseSchema
    {
        /// <summary>The option's name. For protobuf built-in options (options defined in descriptor.proto), this is the
        /// short name. For example, "map_entry". For custom options, it should be the fully-qualified name. For
        /// example, "google.api.http".</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("name")]
        public virtual string Name { get; set; } 

        /// <summary>The option's value packed in an Any message. If the value is a primitive, the corresponding wrapper
        /// type defined in google/protobuf/wrappers.proto should be used. If the value is an enum, it should be stored
        /// as an int32 value using the google.protobuf.Int32Value type.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("value")]
        public virtual System.Collections.Generic.IDictionary<string,object> Value { get; set; } 

        /// <summary>The ETag of the item.</summary>
        public virtual string ETag { get; set; }
    }    

    /// <summary>A single data point in a time series.</summary>
    public class Point : Google.Apis.Requests.IDirectResponseSchema
    {
        /// <summary>The time interval to which the data point applies. For GAUGE metrics, only the end time of the
        /// interval is used. For DELTA metrics, the start and end time should specify a non-zero interval, with
        /// subsequent points specifying contiguous and non-overlapping intervals. For CUMULATIVE metrics, the start and
        /// end time should specify a non-zero interval, with subsequent points specifying the same start time and
        /// increasing end times, until an event resets the cumulative value to zero and sets a new start time for the
        /// following points.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("interval")]
        public virtual TimeInterval Interval { get; set; } 

        /// <summary>The value of the data point.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("value")]
        public virtual TypedValue Value { get; set; } 

        /// <summary>The ETag of the item.</summary>
        public virtual string ETag { get; set; }
    }    

    /// <summary>The range of the population values.</summary>
    public class Range : Google.Apis.Requests.IDirectResponseSchema
    {
        /// <summary>The maximum of the population values.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("max")]
        public virtual System.Nullable<double> Max { get; set; } 

        /// <summary>The minimum of the population values.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("min")]
        public virtual System.Nullable<double> Min { get; set; } 

        /// <summary>The ETag of the item.</summary>
        public virtual string ETag { get; set; }
    }    

    /// <summary>SourceContext represents information about the source of a protobuf element, like the file in which it
    /// is defined.</summary>
    public class SourceContext : Google.Apis.Requests.IDirectResponseSchema
    {
        /// <summary>The path-qualified name of the .proto file that contained the associated protobuf element. For
        /// example: "google/protobuf/source_context.proto".</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("fileName")]
        public virtual string FileName { get; set; } 

        /// <summary>The ETag of the item.</summary>
        public virtual string ETag { get; set; }
    }    

    /// <summary>A time interval extending just after a start time through an end time. If the start time is the same as
    /// the end time, then the interval represents a single point in time.</summary>
    public class TimeInterval : Google.Apis.Requests.IDirectResponseSchema
    {
        /// <summary>Required. The end of the time interval.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("endTime")]
        public virtual object EndTime { get; set; } 

        /// <summary>Optional. The beginning of the time interval. The default value for the start time is the end time.
        /// The start time must not be later than the end time.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("startTime")]
        public virtual object StartTime { get; set; } 

        /// <summary>The ETag of the item.</summary>
        public virtual string ETag { get; set; }
    }    

    /// <summary>A collection of data points that describes the time-varying values of a metric. A time series is
    /// identified by a combination of a fully-specified monitored resource and a fully-specified metric. This type is
    /// used for both listing and creating time series.</summary>
    public class TimeSeries : Google.Apis.Requests.IDirectResponseSchema
    {
        /// <summary>The associated metric. A fully-specified metric used to identify the time series.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("metric")]
        public virtual Metric Metric { get; set; } 

        /// <summary>The metric kind of the time series. When listing time series, this metric kind might be different
        /// from the metric kind of the associated metric if this time series is an alignment or reduction of other time
        /// series.When creating a time series, this field is optional. If present, it must be the same as the metric
        /// kind of the associated metric. If the associated metric's descriptor must be auto-created, then this field
        /// specifies the metric kind of the new descriptor and must be either GAUGE (the default) or
        /// CUMULATIVE.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("metricKind")]
        public virtual string MetricKind { get; set; } 

        /// <summary>The data points of this time series. When listing time series, the order of the points is specified
        /// by the list method.When creating a time series, this field must contain exactly one point and the point's
        /// type must be the same as the value type of the associated metric. If the associated metric's descriptor must
        /// be auto-created, then the value type of the descriptor is determined by the point's type, which must be
        /// BOOL, INT64, DOUBLE, or DISTRIBUTION.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("points")]
        public virtual System.Collections.Generic.IList<Point> Points { get; set; } 

        /// <summary>The associated resource. A fully-specified monitored resource used to identify the time
        /// series.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("resource")]
        public virtual MonitoredResource Resource { get; set; } 

        /// <summary>The value type of the time series. When listing time series, this value type might be different
        /// from the value type of the associated metric if this time series is an alignment or reduction of other time
        /// series.When creating a time series, this field is optional. If present, it must be the same as the type of
        /// the data in the points field.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("valueType")]
        public virtual string ValueType { get; set; } 

        /// <summary>The ETag of the item.</summary>
        public virtual string ETag { get; set; }
    }    

    /// <summary>A protocol buffer message type.</summary>
    public class Type : Google.Apis.Requests.IDirectResponseSchema
    {
        /// <summary>The list of fields.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("fields")]
        public virtual System.Collections.Generic.IList<Field> Fields { get; set; } 

        /// <summary>The fully qualified message name.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("name")]
        public virtual string Name { get; set; } 

        /// <summary>The list of types appearing in oneof definitions in this type.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("oneofs")]
        public virtual System.Collections.Generic.IList<string> Oneofs { get; set; } 

        /// <summary>The protocol buffer options.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("options")]
        public virtual System.Collections.Generic.IList<Option> Options { get; set; } 

        /// <summary>The source context.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("sourceContext")]
        public virtual SourceContext SourceContext { get; set; } 

        /// <summary>The source syntax.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("syntax")]
        public virtual string Syntax { get; set; } 

        /// <summary>The ETag of the item.</summary>
        public virtual string ETag { get; set; }
    }    

    /// <summary>A single strongly-typed value.</summary>
    public class TypedValue : Google.Apis.Requests.IDirectResponseSchema
    {
        /// <summary>A Boolean value: true or false.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("boolValue")]
        public virtual System.Nullable<bool> BoolValue { get; set; } 

        /// <summary>A distribution value.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("distributionValue")]
        public virtual Distribution DistributionValue { get; set; } 

        /// <summary>A 64-bit double-precision floating-point number. Its magnitude is approximately 10300 and it has 16
        /// significant digits of precision.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("doubleValue")]
        public virtual System.Nullable<double> DoubleValue { get; set; } 

        /// <summary>A 64-bit integer. Its range is approximately 9.2x1018.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("int64Value")]
        public virtual System.Nullable<long> Int64Value { get; set; } 

        /// <summary>A variable-length string value.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("stringValue")]
        public virtual string StringValue { get; set; } 

        /// <summary>The ETag of the item.</summary>
        public virtual string ETag { get; set; }
    }
}
